【问题标题】:Yii2 call method/function of a different modelYii2调用不同模型的方法/函数
【发布时间】:2018-11-07 14:29:04
【问题描述】:

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

use Model1;

class Model2 {
    public $virtattr;
    public $_virtattr;

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

你能指出正确的方向吗?

【问题讨论】:

  • Model1::getVirtattr(); 但你的方法也是正确的
  • 但是我怎么会得到空的结果......?我不能使用Model1::getVirtattr();,因为它不是静态的
  • 您收到了什么,您希望收到什么?
  • 为什么在定义 getVirtattr 函数的时候定义了 $virtattr 变量?
  • 看来您需要学习一些 OOP 基础知识。您可能应该看一下特征:php.net/manual/en/language.oop5.traits.php

标签: php oop model yii2 virtual-attribute


【解决方案1】:

对象编程的重点是封装 - 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() 将使用相同的实现。

如果不能/不希望继承,您可以使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多