我遇到了抽象类的问题。目前我使用抽象类runnable来确定我的API需要工作。
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)
我想知道如何在instanciate MyClass之前测试runnable的条件是否满足,我已经尝试了ReflectionClass::isInstantiable但我又得到了这个错误......
$reflectionClass = new ReflectionClass($appName);
if($reflectionClass->IsInstantiable()) {
// OK
} else {
// Cutom error
}
我怎样才能做得好?
感谢您的帮助。
答案 0 :(得分:0)
你不能,一旦你将你的类扩展为抽象,如果它不包含方法(即使在启动类之前),它将抛出一个错误。
你不能用反射做,因为只有反射就像名字所说的那样。
你可以尝试用runkit破解它,它应该是你想要的唯一方法。
但最后我真的不知道为什么你需要这样做,为什么不把它扩展到普通类而不是抽象类呢? (如果你真的不关心它)
答案 1 :(得分: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