Yii2调用方法/不同模型的功能

时间:2018-11-07 14:29:05

标签: php oop model yii2 virtual-attribute

我在var pin1 = "7460"; console.log(pin1); //7460 中具有虚拟属性的方法/功能:

Model1

如何在class Model1 { public $virtattr; public $_virtattr; public function getVirtattr () { if (isset($this->_virtattr)) { return $this->_virtattr; } return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr); } } 中调用此方法以得到相同的结果? 我正在尝试这种方式,但不幸的是它没有用,因为我得到的结果是空的:

Model2

您能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

对象编程的重点是封装-Model1不会神奇地使用Model2中的属性,只是因为您在Model1内部实例化了Model2Model1将使用其自己的属性,因此(new Model1())->getVirtattr()不会触摸Model2中的属性。

如果要在两个类之间共享相同的逻辑,则可以使用继承:

class Model1 {

    public $virtattr;
    public $_virtattr;

    public function getVirtattr() {
        if ($this->_virtattr !== null) {
            return $this->_virtattr;
        }

        return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr);
    }
}

class Model2 extends Model1 {

}

然后Model1::getVirtattr()Model2::getVirtattr()将使用相同的实现。

如果无法继承,则可以使用traits在两个单独的类之间共享相同的实现:

trait VirtattrTrait {

    public $virtattr;
    public $_virtattr;

    public function getVirtattr() {
        if ($this->_virtattr !== null) {
            return $this->_virtattr;
        }

        return $this->_virtattr = str_ireplace('x1', 'x2', $this->virtattr);
    }
}

class Model1 {

    use VirtattrTrait;
}

class Model2 {

    use VirtattrTrait;
}