【问题标题】:decalare method depend on superclass in php [closed]声明方法依赖于php中的超类[关闭]
【发布时间】:2012-11-27 07:01:10
【问题描述】:

我想将子类中的方法声明为静态或非静态取决于父类。 我正在使用 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() 成为非静态方法

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

【问题讨论】:

  • 如果该类在父类中应该是静态的,而在子类中是非静态的,则表明方法不一样,因此您不应该在子类中重载它们而是编写一种新方法。
  • 好吧,要么设为static,要么不设为。不可能两者兼而有之。你是什​​么意思你想改变它“取决于父母”?这会动态变化吗?
  • 我想让新旧版本都兼容:(我可以在子类中进行更改,但不能在父类中进行更改
  • 你能试着回答问题吗?为什么它必须与两者兼容?为什么你的类可能有两个不同的不兼容的父类?

标签: php static


【解决方案1】:

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

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

$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';
}

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

【讨论】:

  • 错误解决方案的出色实施!点赞!
  • 您好,谢谢您的回复,我将验证并使用它,这最适合我的情况:)
【解决方案2】:

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

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

如果你的情况可以接受的话。

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

【讨论】:

  • 是的,这绝对有效,但我希望孩子对父母的任何一种情况都有效。你是对的,但你能建议我另一种方式吗?
猜你喜欢
  • 2016-12-17
  • 2019-08-15
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2023-04-09
  • 2014-09-30
相关资源
最近更新 更多