“公共静态”还是“静态公共”?

Posted

技术标签:

【中文标题】“公共静态”还是“静态公共”?【英文标题】:"public static" or "static public"? 【发布时间】:2010-10-19 22:27:50 【问题描述】:

关于 php 中函数声明关键字的一个小问题:如果你有一个静态的类方法,static 关键字应该放在可见性关键字之前还是之后(publicprotectedprivate) ?假设您的所有方法(静态或其他方法)都有可见性关键字,那么您希望可见性关键字相对于 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() 

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

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

【问题讨论】:

【参考方案1】:

来自 PSR-2:

必须在所有属性和方法上声明可见性;抽象的 final 必须在可见性之前声明;静态必须是 可见性后声明。 [reference]

...如果您关心 PHP Framework Interop Group 标准和约定。

根据他们的说法,public static 不是 static public

【讨论】:

更完整的引用:“必须在所有属性和方法上声明可见性;必须在可见性之前声明抽象和最终;必须在可见性之后声明静态。” source 我的意思是他们不也提倡将 单独放在新行上吗?总.. @Eva 仅用于方法和类声明。对于循环和条件等,他们建议将它们放在行尾的空格后面:php-fig.org/psr/psr-2 我个人觉得这比将所有大括号都放在行尾更容易阅读。【参考方案2】:

进一步Alexei Tenitski's answer。

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 类更容易快速理解。

【讨论】:

@aW-k9IdI'-I0llwlg'I - 我不明白你的意思。您不能反转访问修饰符的参数 - “所有方法都应该指定它们的可见性。只有一些方法具有静态状态的指示”。【参考方案3】:

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

【讨论】:

我打算写这个作为答案。我完全同意。【参考方案4】:

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

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

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

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

【讨论】:

我考虑过省略“public”,因为它在技术上是多余的,但我发现最好是明确的。这样当我六个月后回到我的代码时,我就不必想知道为什么方法 foo(); 上没有 access 关键字。我只是忘了放一个,还是我的意思是要公开?【参考方案5】:

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


public static

在我看来是正确的。可以为这两种方法提出论据,我的观点是这样的:由于“静态”限定了函数而不是访问修饰符,所以说

<access_modifier> static

如果你反过来使用它,“静态”的含义就不太清楚了。

【讨论】:

既不 Java 也不 C#需要这个。我相信他们推荐它,但“静态公共”在两种语言中都有效。 (我刚刚编译了一个测试程序来检查。) (尽管取消了我的反对意见,因为其余的都足够公平 - 我当然同意“公共静态”看起来更合理。) 我认为无论您使用什么,只要保持一致即可。那么没有人会关心你使用什么顺序。【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于“公共静态”还是“静态公共”?的主要内容,如果未能解决你的问题,请参考以下文章

MFC C++ 使用静态成员和编译问题

超类中的私有final可以被覆盖吗?

私有字符串还是公共静态字符串?

公共静态方法与公共方法

php静态方法-“静态函数”和“公共静态函数”有啥区别?

公共静态变量值