OOP问题:无法调用抽象方法

时间:2018-07-20 18:00:11

标签: php oop static abstract traits

我有一个包含抽象类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体系结构中有问题。

我该如何解决?

1 个答案:

答案 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中的(存根)方法来实现,但是在您的问题中没有迹象表明这是您的初衷。

view online parsed @ eval.in