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

FZE*_*FZE 0 php oop

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

abstract static public function mapAttributeKeys(array $attributes)

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

abstract public static function mapAttributeKeys(array $attributes)

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

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

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

更新 :

我看到/sf/answers/751804791/这个解释真有意义.

An abstract function will never be static, in any kind of language
Run Code Online (Sandbox Code Playgroud)

如果是真的,为什么存在实施?

甚至在symfony验证器加载器中.

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

dec*_*eze 6

abstract,public并且static是函数定义的所有修饰符关键字.没有特定的顺序需要说明,它们都是同等重要的,不以任何方式依赖或互相交流.

一个大的蓝色圆球与蓝色圆形大球相同.


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

Jein.

使用abstractis来强制子类实现特定方法,因此父类的父类/用户可以依赖于那里的方法:

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

function baz(Foo $foo) {
    $foo->bar();
}
Run Code Online (Sandbox Code Playgroud)

baz不知道什么具体的实例中Foo,它会接受,但可以肯定它会有一个bar方法.

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

Foo::bar();
Run Code Online (Sandbox Code Playgroud)

如果你正在写这篇文章,你就会知道你正在打电话给什么课bar.你不会在这里替换 Foo ; Foo是硬编码的,它不是一个变量,如同$foo.*所以...你已经知道你得到了什么,并且不需要一些abstract基类来为你强制实现某些接口.

*即使您使用字符串变量动态更改类名,也是如此.关键是你不能输入提示,所以你自己.包含abstract方法的类接口只对类型提示变得有用和有趣,只能通过对象实例来完成.

这是可能的执行static方法,要在子类中定义,它只是通常不会做一大堆的现实意义.