Я согласен с «слишком много PHP», попробуйте это:
class Grandpa
{
public function __construct()
{
echo 'Grandpa<br/>';
}
}
class Papa extends Grandpa
{
public function __construct()
{
echo 'Papa<br/>';
parent::__construct();
}
}
class Kiddo extends Papa
{
public function __construct()
{
// THIS IS WHERE I NEED TO CALL GRANDPA'S
// CONSTRUCTOR AND NOT PAPA'S
echo 'Kiddo<br/>';
Grandpa::__construct();
}
}
$instance = new Kiddo;
Я получил ожидаемый результат:
Kiddo
1010 * Дедушка *
Это функция не ошибка, проверьте это для справки:
https://bugs.php.net/bug.php?id=42016
Так оно и есть. Если он видит, что исходит из правильного контекста, эта версия вызова не обеспечивает статический вызов.
Вместо этого он просто сохранит $ this и будет счастлив с этим.
parent :: method () работает аналогично, вам не нужно определять метод как статический, но его можно вызывать в том же контексте. Попробуйте это для более интересного:
class Grandpa
{
public function __construct()
{
echo 'Grandpa<br/>';
Kiddo::hello();
}
}
class Papa extends Grandpa
{
public function __construct()
{
echo 'Papa<br/>';
parent::__construct();
}
}
class Kiddo extends Papa
{
public function __construct()
{
// THIS IS WHERE I NEED TO CALL GRANDPA'S
// CONSTRUCTOR AND NOT PAPA'S
echo 'Kiddo<br/>';
Grandpa::__construct();
}
public function hello()
{
echo 'Hello<br/>';
}
}
$instance = new Kiddo;
Это также работает как ожидалось:
Kiddo
Дедушка
Hello
Но если вы попытаетесь инициализировать новый Papa, вы получите ошибку E_STRICT:
$papa = new Papa;
Строгие стандарты: нестатический метод Kiddo :: hello () не должен вызываться статически, предполагая $ this из несовместимого контекста
Вы можете использовать instanceof, чтобы определить, можно ли вызвать метод Children :: method () в родительском методе:
if ($this instanceof Kiddo) Kiddo::hello();