Yii2 调用 method/function 不同的模型

Yii2 call method/function of a different model

我在Model1中有一个method/function的虚拟属性:

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 中调用此方法以获得相同的结果? 我以这种方式尝试但不幸的是它不起作用,因为我得到的结果是空的:

use Model1;

class Model2 {
    public $virtattr;
    public $_virtattr;

    public function getVirtattr () {
        return (new Model1)->getVirtattr();
    }
}

你能给我指明正确的方向吗?

对象编程的重点是封装 - Model1 不会仅仅因为您在 Model2 中实例化 Model1 就神奇地使用 Model2 中的属性。 Model1 将使用自己的属性,因此 (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() 将使用相同的实现。

如果继承不是 possible/preferred,您可以使用 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;
}