Yii2 вызов метода / функции другой модели

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

Решение

Точка объектного программирования — инкапсуляция. 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]