Конечно:
Неустранимая ошибка: невозможно вызвать abstract base base :: test ()
У него нет тела метода, который вы могли бы вызвать. Если предполагается, что run () - шаблонный метод , вы ссылаетесь на область действия класса с $this
вместо self
, а затем создаете экземпляр $ son для вызова run (), например:
abstract class BaseClass {
abstract public function test();
public function run()
{
$this->test();
}
}
class Son extends BaseClass {
public function test()
{
echo 1;
}
}
$son = new Son;
$son->run(); // 1
, что довольно странно, потому что тогда вы могли бы точно так же вызвать test () напрямую.
Также обратите внимание, что в вашем примере
son::run();
неверно, потому что метод run () не объявлен как статический, и хотя PHP выполнит run (), тем не менее, это считается неправильным использованием и вызовет ошибку E_STRICT. Однако, если бы вы определили статическую функцию run (), вы бы больше не могли ссылаться на $this
, потому что статический метод вызывается не из области видимости экземпляра, а из области класса.
Редактировать Я собирался добавить решение PHP5.3, но вижу, что @erenon уже делал это, пока я печатал, поэтому я только добавляю соответствующую ссылку в Руководство по PHP для Позднее статическое связывание .