2014-01-13 4 views
0

У меня проблема с абстрактным классом. В настоящее время я использую абстрактный класс runnable, чтобы определить, что мой API должен работать.Ошибка абстрактного класса PHP абстрактная

abstract class runnable { 
    abstract protected function __setConfig(); 
    abstract public function __run(api $api); 

    public function run(api $api){ 
     $this->__setConfig(); 
     $this->__run($api); 
    } 
} 

у меня нет проблемы с этим, но когда я скучаю один метод я получил эту фатальную ошибку:

Fatal error: Class MyClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (runnable::__setConfig)

Я хотел бы знать, как я могу проверить, если выполнены условия Runnable-х Перед MyClass создания экземпляра, я попытался с ReflectionClass::isInstantiable, но я получаю эту ошибку снова ...

$reflectionClass = new ReflectionClass($appName); 
if($reflectionClass->IsInstantiable()) { 
    // OK 
} else { 
    // Cutom error 
} 

Как я могу сделать это правильно?

Благодарим за помощь.

+0

Вы ступая опасный путь, префикс вашего метода с помощью '__' - PHP хранит имена методов, начинающиеся с двух символов подчеркивания – Bojangles

ответ

0

Вы не можете, как только вы расширите свой класс до абстракции, он выкинет ошибку, если она не содержит методов (даже до начала класса).

Вы не можете сделать это с отражением, потому что это отражение только в том виде, в каком оно указано.

Вы можете попытаться взломать его с помощью runkit, это должен быть единственный способ сделать то, что вы хотите.

Но, в конце концов, я не знаю, зачем вам это нужно, почему бы вам просто не распространить его на обычный класс, а не на абстрактный? (Если вы на самом деле не заботиться о нем)

0

В этом случае вы можете создать что-то вроде этого интерфейса:

interface runnableInterface { 
    public function run(api $api); 
    public function setConfig(); 
} 

abstract class runnableAbstract implement runnableInterface { 
    public function run(api $api){ 
     $this->setConfig(); 
     $this->run($api); 
    } 
} 

class runnable extends runnableAbstract implement runnableInterface { 
    public function setConfig() { 
     // do something here 
    }; 
    public function run(api $api){ 
     $this->setConfig(); 
     $this->run($api); 
    } 
} 

Также вы можете прочитать Object Interfaces и Class Abstraction

Смежные вопросы