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