抽象公共静态与抽象静态公共之间的PHP差异

时间:2016-02-08 13:26:08

标签: php oop

我错误地将方法签名定义为

abstract static public function mapAttributeKeys(array $attributes)

它运行正常,但是当我重构代码时,我发现它看起来不太好,根据我的习惯它应该如下。

abstract public static function mapAttributeKeys(array $attributes)

我对这两个如何运作感到很惊讶。我以为上面的语法是错误的语法。

所以这两个正在发挥作用。这个定义没有严格限定的原因吗?或者类似于模式的匹配?

我的目标是了解为什么存在这些灵活性?是否存在任何特殊方法或实施技巧?

更新:

我看到https://stackoverflow.com/a/10740068/1147648这个解释真有意义。

An abstract function will never be static, in any kind of language

如果确实存在,为什么存在实施?

即使在symfony验证器加载器中也是如此。

https://github.com/symfony/validator/blob/master/Tests/Mapping/Loader/AbstractStaticMethodLoader.php

1 个答案:

答案 0 :(得分:6)

abstractpublicstatic都是函数定义的修饰符关键字。它们没有特定的顺序需要陈述,它们具有同等重要性,并且不以任何方式依赖或互相交流。

一个大的蓝色圆球和一个蓝色的圆形大球相同。

  

抽象函数永远不会是任何语言的静态

Jein.

使用abstract是为了强制子类实现一个特定的方法,所以父类的父类/用户可以依赖于那里的方法:

abstract class Foo {
    abstract public function bar();
}

function baz(Foo $foo) {
    $foo->bar();
}

baz并不知道它会收到Foo的具体实例,但可以肯定它会有bar {1}}方法。

现在,static方法只能在类本身上调用:

Foo::bar();

如果你正在写这个,你知道你打电话给bar的课程。你不会去替换 Foo在这里; Foo是硬编码的,它不是$foo的变量。*所以......你已经知道你得到了什么,不需要一些{{1}基类为你强制实现一些接口。

*即使您使用字符串变量动态更改类名,也是如此。关键是你不能输入提示,因此你可以自己动手。类接口(包括abstract方法)只对类型提示有用且有趣,只能用对象实例完成。

可能强制在子类上定义abstract方法,它通常不会产生很多实际意义。