46

关于 PHP 中函数声明关键字的一个小问题:如果您有一个静态的类方法,该关键字应该static在可见性关键字(public, protected, private)之前还是之后?假设您的所有方法,无论是静态方法还是其他方法,都有一个可见性关键字,那么您希望可见性关键字相对于关键字保持在同一位置function

public function foo() {}

public function bar() {}

protected function baz() {}

private function quux() {}

现在假设一对是静态的:

public function foo() {}

static public function bar() {}

protected function baz() {}

static private function quux() {}

此外,如果一个方法是静态的,你希望它是第一个看到的,因为这对它是什么类型的方法的影响甚至比可见性关键字的影响更大。

这严格来说是一个可读性问题,因为它显然没有功能或设计后果。(我能想到的。)

4

7 回答 7

54

来自 PSR-2:

必须在所有属性和方法上声明可见性;abstract 和 final 必须在可见性之前声明;static 必须在可见性之后声明。[参考]

...如果您关心 PHP 框架互操作组标准和约定。

所以public static不是static public根据他们。

于 2014-08-29T05:38:54.823 回答
46

Java 和 C# 等语言要求访问修饰符位于首位,因此 编辑:之前的划线是完全错误的。两种语言都没有这个要求。


public static

对我来说看起来是正确的。可以为这两种方法提出论据,我的观点是:由于“静态”限定了函数而不是访问修饰符,因此说起来更有意义

<access_modifier> static

如果你以相反的方式使用它,“静态”的含义就不太清楚了。

于 2009-04-16T18:25:40.873 回答
12

阿列克谢·特尼茨基的回答之后

I prefer static public since this way 
it is easier to spot [usually rare] static methods in classes.

所有方法都应该指定它们的可见性。所以,我们知道每个方法都会在定义中提到,唯一的问题是“它是哪个设置?”。

只有一些是静态的——所以,对于每一个,我们都必须问“定义中的某处是否提到了 static 关键字?”。所以,把静态放在第一位,让这个问题的答案更明显。

或者,作为更广泛的规则,…………我倾向于把“最非凡的方面”放在首位,这样我在阅读时就不会下意识地跳过一些东西。;o)

试试这个测试。

很快……A 类中有多少个静态方法?

class A {
 public static methodA() {
  }
 protected static methodB() {
  }
 private staticlymethodC() {
  } 
}

B 类中有多少个静态方法?

class B {
 public methodA() {
  }
 static protected methodB() {
  }
 static private methodC() {
  } 
}

我认为B类更容易快速理解。

于 2012-04-01T16:48:57.510 回答
9

我不认为这是一个严格的 PHP 问题,而且对于它的价值来说,我一直更喜欢将可见性修饰符放在首位的一致性。我觉得扫描起来更容易。

于 2009-04-16T18:25:50.593 回答
5

在我使用的每种具有类型修饰符的语言中,我都将可见性放​​在首位。

于 2009-04-16T18:31:07.520 回答
5

我更喜欢static public这种方式,因为这样更容易在类中发现[通常很少见的]静态方法。

于 2009-10-02T05:11:43.673 回答
1

您是正确的,因为它对代码没有影响。因此,这取决于您自己或您团队的风格要求,至于您所做的事情。与他们协商并就风格达成一致。

如果您只是为自己编码,那么您应该自己选择。选择并不重要,但一致性很重要。

您可能会问的另一个问题是:您是否应该使用“public”?为了向后兼容(PHP4 没有信息隐藏),任何没有可见性修饰符的东西默认都是公开的。如果它是公开的,你应该费心写公开吗?再次个人选择:无论哪种方式都提出强有力的论据,你会说服我你的选择是最好的。

就个人而言,当我整理并清理自己的代码时,我喜欢将可见性修饰符放在首位,即使它是公开的,也要指定它。

于 2009-04-17T17:33:58.413 回答