Yii2 вызов метода / функции другой модели - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть метод / функция виртуального атрибута в 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();
    }
}

Не могли бы вы указать мне правильное направление?

1 Ответ

0 голосов
/ 08 ноября 2018

Смысл объектного программирования - инкапсуляция - 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() будут использовать одну и ту же реализацию.

Если наследование невозможно / предпочтительнее, вы можете использовать признаки , чтобы разделить одну и ту же реализацию между двумя отдельными классами:

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;
}
...