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


PHP differences between abstract public static vs abstract static public

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

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

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

一个大的、蓝色的

、圆的球和一个蓝色的、圆形的、大球是一样的。


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

杰因。

abstract 的用途是强制子类实现特定方法,因此父类的父类/用户可以依赖该方法:

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

baz不知道它将收到Foo的具体实例,但它可以肯定它会有一个bar方法。

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

Foo::bar();

如果你正在写这篇文章,你就知道你在哪个类上bar你不会在这里代替Foo; Foo是硬编码的,它不像$foo那样是一个变量。您已经知道要得到什么,并且不需要一些abstract基类来为您强制执行某些接口。

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

可以在子类上强制定义static方法,只是通常没有多大实际意义。