-2

我想将子类中的方法声明为静态或非静态取决于父类。我正在使用 php,由于版本更改,我遇到了这个问题,有人可以帮忙吗?这是一个例子,展示了到底发生了什么变化

//in earlier version
class parent{

  function test(){
    //some code here
  }
}

class child extends parent{

  function test(){
    //some code here
  }
}

//in new version
class parent{

  static function test(){
    //some code here
  }
}

class child extends parent{

  function test(){
    //some code here
  }
}

致命错误:无法在子类中使静态方法 parent::test() 非静态

我希望我的代码与这两个版本兼容。我该怎么办?

4

2 回答 2

2

前言:这是一个非常糟糕的主意。如果你的基础框架在两个版本之间发生了如此根本的变化,以至于 API 破坏了向后兼容性,你应该为你的类创建两个单独的版本,分别针对旧版本和新版本。很可能不仅仅是函数签名更改为static,您很可能必须更改大量代码才能使用这种新static的做事方式。

不过,要回答您的字面问题:您不能创建一个与两者兼容的类,因为更改根本不兼容。您可以根据您的目标版本动态声明不同的类。如果基础框架没有可以读取的明显版本号,则可以自省父类:

$class  = new ReflectionClass('Parent');
$method = $class->getMethod('test');

if ($method->isStatic()) {
    // include code for new version
    require_once 'child.new.class.php';
} else {
    // include code for old version
    require_once 'child.old.class.php';
}

同样,由于相同名称下的代码重复,这是一个非常糟糕的主意。但这是唯一的选择。

于 2012-11-27T08:07:45.797 回答
0

您不能用非静态方法覆盖静态方法。您可以尝试在孩子中进行简单的覆盖

public static function test(){
 //some code here
 }

如果它在你的情况下是可以接受的。

确实,您陷入了一种非常糟糕的编码方式。您必须找到比检查父类中是否存在静态或非静态方法更好的解决方案。

于 2012-11-27T07:17:43.890 回答