当前位置: 首页 > 面试题库 >

为什么PHP 5.2+不允许抽象静态类方法?

解念
2023-03-14
问题内容

在PHP 5.2中启用严格警告之后,我看到了一个项目中的大量严格标准警告,这些项目最初编写时没有严格警告:

严格标准静态函数 Program :: getSelectSQL()在Program.class.inc中 不应抽象

有问题的函数属于抽象父类Program,并且被声明为抽象静态,因为它应该在其子类(例如TVProgram)中实现。

我确实在这里找到有关此更改的参考:

删除了抽象静态类函数。由于疏忽,PHP 5.0.x和5.1.x允许在类中使用抽象静态函数。从PHP 5.2.x开始,只有接口可以拥有它们。

我的问题是:有人可以清楚地解释为什么PHP中不应该有一个抽象的静态函数吗?


问题答案:

静态方法属于声明它们的类。扩展类时,可以创建一个同名的静态方法,但实际上并没有实现静态抽象方法。

使用静态方法扩展任何类也是如此。如果扩展该类并创建具有相同签名的静态方法,则实际上并没有覆盖超类的静态方法。

编辑 (2009年9月16日) 对此进行了更新。运行PHP5.3,我看到抽象静态技术又回来了,不管是好是坏。

__
abstract staticPHP 5.3仍然不允许 更正(由philfreo进行),LSB是相关的但有所不同。



 类似资料:
  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 问题内容: 我已经开始学习用于Android应用程序开发的Java语言。 根据我对静态类的理解,我们无法实例化静态类的对象。 但是,为什么在随后的情况下允许实例化静态嵌套类对象? 如果将内部类的对象标记为静态,为什么我们可以创建它呢? 问题答案: 根据我对静态类的理解,我们无法实例化静态类的对象。 您对“静态类”的含义的理解不正确。基本上, Java中 的“静态类” 是嵌套类,它没有对包含类的实例

  • 问题内容: 问题是在Java中为什么不能定义抽象静态方法?例如 问题答案: 因为“抽象”的意思是:“不实现任何功能”,而“静态”的意思是:“即使没有对象实例也有功能”。这是一个逻辑上的矛盾。

  • 问题内容: 问题是在Java中为什么不能定义抽象的静态方法?例如 问题答案: 因为“抽象”表示:“不执行任何功能”,而“静态”表示:“即使没有对象实例也具有功能”。这是一个逻辑上的矛盾。

  • 但是为什么在下面的情景中允许静态嵌套类对象的实例化呢? 为什么我们可以创建内部类的对象,如果它被标记为静态的?

  • 据我所知,通常应该使用类的引用来调用静态方法,或者如果它位于静态方法或静态块中,则可以不引用直接调用它。 但当从子类静态块调用静态方法时,这是否适用? 为什么它允许这样的事情,因为静态方法不是继承的,所以应该只允许使用父类名对吗? 为什么我的子类静态块可以在没有引用或类名的情况下调用父类静态方法?