У меня есть внешний класс, который имеет другой класс в качестве члена (следуя принципу композиции по наследованию). Теперь мне нужно вызвать метод внешнего класса из класса внутри.
class Outer
{
var $inner;
__construct(Inner $inner) {
$this->inner = $inner;
}
function outerMethod();
}
class Inner
{
function innerMethod(){
// here I need to call outerMethod()
}
}
Я вижу решение добавить ссылку в конструкции Outer :: __:
$this->inner->outer = $this;
Это позволяет мне вызывать внешний метод следующим образом в Inner :: innerMethod:
$this->outer->outerMethod();
Это хорошее решение или есть лучшая альтернатива?
Лучшей идеей было бы включить внешний класс в качестве переменной-члена внутреннего.
Например.
class Inner
{
private $outer;
function __construct(Outer $outer) {
$this->outer= $outer;
}
function innerMethod(){
// here I need to call outerMethod()
$this->outer->outerMethod();
}
}
Если изначально невозможно построить внутреннее с внешним, вы можете поместить setOuter
метод на внутреннем и вызвать его, когда вы передаете его в Outer
,
Например.
class Outer
{
private $inner;
function __construct(Inner $inner) {
$inner->setOuter( $this );
$this->inner = $inner;
}
function outerMethod();
}
class Inner
{
private $outer;
function setOuter(Outer $outer) {
$this->outer= $outer;
}
function innerMethod(){
// here I need to call outerMethod()
$this->outer->outerMethod();
}
}
НОТА: var
так как спецификация как переменная типа является устаревшей. использование public
, protected
или же private
вместо. Совет — ошибаться на стороне частного лица, если у вас нет причин не делать этого.
Других решений пока нет …