Я знаю, что для вас это, вероятно, немного поздно, но мне также пришлось обойти эту проблему. Чтобы помочь другим понять, почему это иногда требуется, вот мой пример:
Я создаю MVC-фреймворк для приложения, у меня есть базовый класс контроллеров, который расширяется каждым отдельным классом контроллеров. Каждый контроллер будет иметь различные методы, в зависимости от того, что контроллер должен делать. Например, mysite.com/event будет загружать контроллер событий. mysite.com/event/create загрузит контроллер событий и вызовет метод create. Чтобы стандартизировать вызов функции create, нам нужен базовый класс контроллера для доступа к методам дочернего класса, которые будут разными для каждого контроллера. Таким образом, в коде у нас есть родительский класс:
class controller {
protected $aRequestBits;
public function __construct($urlSegments) {
array_shift($urlSegments);
$this->urlSegments = $urlSegments;
}
public function RunAction($child) {
$FunctionToRun = $this->urlSegments[0];
if(method_exists($child,$FunctionToRun)) {
$child->$FunctionToRun();
}
}
}
Тогда дочерний класс:
class wordcontroller extends controller {
public function add() {
echo "Inside Add";
}
public function edit() {
echo "Inside Edit";
}
public function delete() {
echo "Inside Delete";
}
}
Таким образом, решение в моем случае состояло в том, чтобы передать сам дочерний экземпляр обратно в родительский класс в качестве параметра.