PHP链接...我无法理解!

如何解决PHP链接...我无法理解!

| 我正在尝试创建一个链接函数来处理从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,self::$originalString);
    self::$string = self::$originalString;
    return self::$instance;
}

function show(){
    return self::$string;
}

}

echo resources::getInstance(\"alpha\") // alpha
    ->replace(\"lpha\",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

?>
    

解决方法

        您的问题是一切都是静态的。我建议重温一些面向对象的编程基础。 因为一切都是静态的,所以状态在所有函数调用之间共享。在
replace(\"vo\",resources::getString(\"charlie\")->show())
行中,对
resources::getString
的嵌套调用用
getString
的参数
charlie
替换了到目前为止构建的字符串(
abravo
)。然后,包装函数被称为
replace(\"vo\",\"charlie\")
,但是
self::$string
的值现在为
charlie
,其中不包含
vo
,因此最终的
show()
然后仅返回
charlie
。如果您用
replace(\"ar\",resources::getString(\"charlie\")->show())
代替
vo
,则最后的
show()
会返回returned18ѭ。 您必须使用非静态成员变量和方法创建一个类,以维护单独的状态。 这是一个工作版本:
class resources {

  private $string;

  public function __construct ($string) {
    $this->string = $string;
  }

  public static function getString ($string) {
    $obj = new resources($string);

    return $obj;
  }

  public function replace ($replace_this,$with_this) {
    # Replace and return instance
    $this->string = str_replace($replace_this,$with_this,$this->string);
    return $this;
  }

  public function show () {
    # Return String
    return $this->string;
  }

}
编辑:我喜欢上面的代码是最接近问题代码的过渡。如果我自己写类似的东西,我会像这样进一步简化它:
class Str {
    private $str;

    private function __construct ($str) {
      $this->str = $str;
    }

    public static function with ($str) {
        return new Str($str);
    }

    public function replace($replace_this,$with_this) {
      $this->str = str_replace($replace_this,$this->str);
      return $this;
    }

    public function __toString () {
      return $this->str;
    }
}

echo Str::with(\'nomster\')->replace(\'nom\',\'mon\') . \"\\n\";
现在不再需要
show()
了,而且键入的名称还不错。可以在这里添加许多其他有用的方法。您想要链接的任何php字符串函数。     ,        多次调用
getString()
时,由于在
getString()
中调用call23ѭ,因此创建了多个实例。 为了防止这种情况的发生,您应该创建方法
getInstance()
并在
getString()
中使用它
public static function getInstance() {
    if(!self::instance) {
        self::instance = new self();
    }
    return self::instance;
}

public static function getString() {
    $instance = self::getInstance();

    // use $instance here instead of self::instance
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?