请教php链式类class里面的变量污染问题如何解决?

class a {
    protected $_a,$_b,$_c;

    public function b(string $_v) {
        $this->_a = $_v;
        return $this;
    }

    public function c(string $_v) {
        $this->_b = $_v;
        return $this;
    }

    public function d(string $_v) {
        $this->_c = $_v;
        return $this;
    }

    public function print() {
        return ($this->_a .' '. $this->_b .' '. $this->_c);
    }
}

$a = new a();

echo $a->b('bbb')->c('ccc')->d($a->b('111')->c('222')->d('333')->print())->print();

理论输出 :bbb ccc 111 222 333
实际输出:111 222 111 222 333

请教如何不重新new对象和static的前提解决变量污染?
感谢

阅读 1.9k
2 个回答
请教如何不重新new对象和static的前提解决变量污染?

使用 clone ,如果你后续还需要用到这个对象,那就单独给一个变量 $b 来保存

$a = new a();

echo $a->b('bbb')->c('ccc')->d(($b = clone $a)->b('111')->c('222')->d('333')->print())->print();

其次,这个不能叫污染,因为你自始至终都是操作的 $a 这一个对象实例,是符合预期的。

需要注意的是

当对象被复制后,PHP 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

如果你的属性是对象,就需要深拷贝,考虑使用 deep-copy

这怎么能叫污染? 污染谁了? 明明是自己赋的值, 为什么叫污染?
程序 从左到右 一步一步的执行, 完全没问题.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题