我有一个包含抽象类AppBase
的PHP内核,该类使用特征Uninstall
。
为了强制开发人员实现静态函数以删除主类MyApp
中的某些选项,AppBase
实现了带有静态函数'delete_options()'的接口。
AppBase
abstract class AppBase implements iUninstall{
use Uninstall;
}
卸载
trait Uninstall{
public static function uninstall(){
//Do some general stuff
self::delete_options();
}
}
iUninstall
interface iUninstall {
public static function delete_options();
}
MyApp
include_once "core/iUninstall.php";
include_once "core/Uninstall.php";
include_once "core/AppBase.php";
class MyApp extends AppBase{
public static function delete_options() {
delete_option( "first-option" );
delete_option( "second-option" );
}
}
我的问题是出现此错误:
PHP致命错误:未捕获错误:无法在Uninstall.php中调用抽象方法iUninstall :: delete_options()
我可以看到特征Uninstall
必须附加到AppBase
上才能使用delete_options
,所以我的OOP体系结构中有问题。
我该如何解决?
答案 0 :(得分:1)
首先,您应该遇到一个致命错误:AppBase
拥有抽象方法delete_options()
而不是抽象类。因此,您需要使AppBase
成为抽象类。 (但也许您只是忘记将其复制到示例中。)
然后,在Uninstall::uninstall()
中,您需要使用static
而不是self
(才能使用late static binding)。
因此,总结一下:
trait Uninstall {
public static function uninstall(){
// static instead of self
static::delete_options();
}
}
interface iUninstall {
public static function delete_options();
}
// abstract class instead of class
abstract class AppBase implements iUninstall{
use Uninstall;
}
class MyApp extends AppBase {
public static function delete_options() {
echo 'deleting';
}
}
MyApp::uninstall();
/* result:
deleting
*/
或者...您可以仅将delete_options()
作为AppBase中的(存根)方法来实现,但是在您的问题中没有迹象表明这是您的初衷。