Можно ли вызвать метод родителей в дочернем классе, который не распространяется на его родителей? У меня есть что-то подобное:
<?php
class wrapper {
private $inner;
public function __construct() {
$this->inner = new inner();
}
// this will never get called :(
public function foo() {
echo "foo called in parent";
}
public function bar() {
return $this->inner->bar();
}
public function getOtherStuff() {
return $this->inner->blafasel;
}
}
class inner { // would only be created in class wrapper, never outside
public $blafasel;
public function __construct() {
// do something
$this->blafasel = "other stuff";
}
public function bar() {
// do stuff
echo "bar called in inner";
$this->foo(); // fatal error, method not declared
parent::foo(); // fatal error, class has no parent
// ??
return "something"}
}
$test = new wrapper();
$something = $test->bar();
?>
пожалуйста, не спрашивайте, почему я не использую class inner extends wrapper
, Я должен использовать это как причину старых вещей и других необходимых вещей. Так можно ли вызывать wrapper :: foo, не будучи статичным? Оболочка использует некоторые общедоступные переменные внутренней и прочее.
Я пытался добавить $this
при вызове конструктора inner, но это приводит только к переполнению памяти или просто к отражению оболочки.
Так можно ли вызвать метод foo () оболочки в inner’b bar () или мне нужно переписать все это, чтобы оно могло использовать расширенные классы? Я знаю, что я должен переписать это, но это займет недели, и мне нужна эта вещь .. хорошо .. вчера.
Спасибо за любую помощь / подсказки / исправления 🙂
Есть больше inner
классы, которые будут вызываться в конструкторе-обертке, и все они имеют (вроде) одни и те же методы, но выполняют разные функции, зависит от самого внутреннего класса. (весь код слишком длинный, даже для pastebin)
некоторые фрагменты:
class wrapper {
public function __construct($loadclass=1) {
if($loadstuff==1)
$this->inner = new inner();
else
$this->inenr = new otherinner();
}
}
а потом
class otherinner {
public function bar() {
// doing different stuff than inner::bar()
// but call wrappers foo() may with possible args
}
}
я надеюсь, что это прояснит «почему бы не использовать расширяет»
class Inner extends Wrapper {
public function __construct() {
parent::foo();
}
}
new Inner();
Ваша текущая оболочка ожидает внедрения внутреннего объекта, теперь эта оболочка является частичным объектом, внутренняя часть которого будет завершена или простираться
Расширяя частичный класс, класс расширения наследует частичный класс. Без расширения нет «родителя».
Вы просто используете обертку как внедрение зависимостей в своем коде, а не как расширение.
Других решений пока нет …