У меня есть метод / функция виртуального атрибута в 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
не будет магически использовать свойства из 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;
}
Других решений пока нет …