【发布时间】:2011-06-13 21:03:56
【问题描述】:
我正在尝试创建一个链接函数来处理从 XML 文件返回的字符串。
1 个原始字符串可能有多个替换,其中一些来自 XML 文件。
这是丑陋的标准包装方法:
str_replace("what","is meant", str_replace("name","randomer",str_replace("blah", "hello", $string1)));
这是我尝试复制的方法(如 Java):
$string1.replace("blah","hello").replace("name","randomer").replace("what","is meant");
有了上面,它就很容易工作了……直到我使用 XML 函数来获取替换字符串。
这是我的课:
class resources{
private static $instance, $string;
public static function getString($stringName){
# Create new instance
self::$instance = new self;
# Grabs stringName from an XML file
self::$string = $stringName;
# Return instance
var_dump(self::$instance);
return self::$instance;
}
public static function replace($replace_this, $with_this){
# Replace and return instance
self::$string = str_replace($replace_this, $with_this, self::$string);
return self::$instance;
}
public static function show(){
# Return String
return self::$string;
}
}
echo resources::getString("alpha") // alpha
->replace("lpha","bravo") // abravo
->replace("vo", resources::getString("charlie")->show()) // should be abracharlie
->show(); // charlie
我希望它了解为什么它没有按我认为的那样工作,以及它应该如何实际工作。 似乎当我再次调用该类时(尽管 var_dump 说它是一个单独的实例),它用“charlie”替换了原始文本,所以我不能只替换第一位的一部分。
谢谢,多米尼克
编辑:是的!我已经想通了(使用静态),但似乎下面的 Ryano 有一个更好的解决方案
<?php
class resources{
private static $instance, $string, $originalString;
public static function getInstance($stringName){
self::$instance = new self();
self::$originalString = $stringName;
return self::$instance;
}
public static function getString($stringName){
# Grabs stringName from an XML file
self::$string = $stringName;
return self::$instance;
}
function replace($replace_this, $with_this){
self::$originalString = str_replace($replace_this, $with_this, self::$originalString);
self::$string = self::$originalString;
return self::$instance;
}
function show(){
return self::$string;
}
}
echo resources::getInstance("alpha") // alpha
->replace("lpha","bravo") // abravo
->replace("vo", resources::getString("charlie")->show()) // should be abracharlie
->replace("lie", resources::getString("vo")->show()) // abracharvo
->show(); // abracharvo
echo "<br />";
echo resources::getInstance("randomer") // randomer
->replace("er","") // random
->replace("ran", resources::getString("")->show()) // dom
->replace("dom", resources::getString("Dom")->show()) // Dom
->show(); // Dom
echo "<br />";
echo resources::getInstance("nomster") // nomster
->replace("nom","nmo") // nmoster
->replace("nom", resources::getString("mon")->show()) // nmoster
->replace("nmo", resources::getString("mon")->show()) // monster
->show(); // monster
?>
【问题讨论】:
-
我假设你看过一些糟糕的设计模式建议。摆脱所有
static和self::的东西并使用$this->代替它。并给该类一个适当的名称(“mystrings”),如果这是它所处理的。 -
静态方法试图将每个对象保持在它自己的范围内,但它似乎不起作用。我最初确实像您说的那样拥有它,但这也不起作用,因此尝试了多种方法。资源在其简单的形式中是一个坏名字,但我已经剥离了很多代码来尝试让基本功能正常工作
-
如果嵌套超过 2 个级别,您的“工作”版本将不起作用。试试
resources::getInstance("nomster")->replace('nom', resources::getInstance("mon")->replace("o", resources::getInstance('bob')->show())->show())->show()。当它应该返回mbobnster时,这将返回bb。 -
那是因为您在 replace 方法中调用 getInstance 。您只在第一次调用 getInstance 以便可以在同一页面上多次使用该类。如果您复制并粘贴我的示例,它可以 100% 工作。我将看看您在下面发布的内容,因为我确定我即将学到一些东西:D
标签: php oop static replace method-chaining