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
?>