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

抽象公共静态与抽象静态公共之间的PHP差异,php,oop,Php,Oop,我错误地将方法签名定义为 抽象静态公共函数mapAttributeKeysarray$attributes 它工作正常,但当我重构代码时,我发现它看起来不太好,根据我的习惯,它应该如下所示 抽象公共静态函数mapAttributeKeysarray$attributes 我对这两种方法的工作原理有点惊讶。我认为上面的语法是错误的语法 所以这两个是有效的。有什么理由不严格定义吗?或者类似于模式匹配的东西 我的实际目的是了解为什么存在这些灵活性?是否存在任何特殊的方法或实现技巧 更新: 我觉得这个解

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

抽象静态公共函数mapAttributeKeysarray$attributes

它工作正常,但当我重构代码时,我发现它看起来不太好,根据我的习惯,它应该如下所示

抽象公共静态函数mapAttributeKeysarray$attributes

我对这两种方法的工作原理有点惊讶。我认为上面的语法是错误的语法

所以这两个是有效的。有什么理由不严格定义吗?或者类似于模式匹配的东西

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

更新:

我觉得这个解释很有意义

An abstract function will never be static, in any kind of language
如果这是真的,为什么存在实现

即使在symfony验证加载程序中

抽象、公共和静态都是函数定义的修改器关键字。没有特定的顺序需要说明,它们都具有同等的重要性,不以任何方式相互依赖或相互影响

一个蓝色的大圆球和一个蓝色的圆球是一样的

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

抽象的使用是为了强制子类实现特定的方法,因此父类/父类的用户可以依赖该方法:

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

function baz(Foo $foo) {
    $foo->bar();
}
baz不知道它将接收到什么特定的Foo实例,但可以确定它将有一个bar方法

现在,只能对类本身调用静态方法:

Foo::bar();
如果你在写这篇文章,你就知道你在哪门课上打电话了。你不能在这里代替福;Foo是硬编码的,不像$Foo.*那样是一个变量。。。您已经知道将得到什么,不需要一些抽象基类来为您强制执行某些接口

*即使您使用字符串变量动态更改类名,这也是正确的。关键是你不能在上面输入提示,所以你只能靠自己了。包含抽象方法的类接口只有在类型暗示时才变得有用和有趣,而类型暗示只能在对象实例中完成


可以强制在子类上定义静态方法,但通常没有太多实际意义。

您可以按任何顺序放置这些关键字。这是按字母顺序排列的:首先是摘要,然后是私有/受保护/公共,最后是静态的。太好了,我不知道这一点。我接受你对我基本问题的回答,我更新了我的问题。你能澄清一下更新后的问题吗?我看到了非常清楚的解释,谢谢你的回答。