与PHP类方法中的主要下划线有什么关系?

noc*_*ash 151 php coding-style

在查看各种PHP库时,我注意到很多人选择使用单个下划线为某些类方法添加前缀,例如

public function _foo()
Run Code Online (Sandbox Code Playgroud)

...代替...

public function foo()
Run Code Online (Sandbox Code Playgroud)

我意识到这最终归结为个人偏好,但我想知道是否有人对这种习惯的来源有所了解.

我的想法是,它可能是从PHP 4继承的,在类方法可以被标记为受保护或私有之前,作为暗示"不要从类外调用此方法"的一种方式.然而,我也想到它可能起源于我不熟悉的某个地方(一种语言),或者背后可能有很好的推理,我会从中获益.

任何想法,见解和/或意见将不胜感激.

Jer*_*oot 148

这是面向对象PHP(PHP 4)的旧时代.面向对象的实现非常糟糕,并没有包括私有方法之类的东西.为了弥补这一点,PHP开发人员开始使用下划线表示私有的方法.在一些较旧的课程中,你会看到/**private*/ __foo() {给它一些额外的重量.

我从来没有听说开发人员用下划线填充所有方法,所以我无法解释导致这种情况的原因.

  • 我在我的控制器中的方法之前放置一个下划线,这些方法是类的私有,并且在路由中未使用.因为我使用自己的框架,所以这增加了安全性,因为我强制执行路由中控制器名称没有前导下划线的策略.但是每个控制器很少超过1-2个方法. (12认同)
  • 按照惯例,使用perl,以下划线开头的方法是私有的.但这只是一个惯例.事实上,这些方法仍然可以在课外进行. (6认同)

joe*_*von 72

我相信现在这类PHP约定的最权威来源是PSR-2:编码风格指南,因为Zend框架是PSR的一部分:

属性名称不应以单个下划线为前缀,以指示受保护或私有可见性.

  • 我认为,使用命名约定并不是爱语言的理由. (9认同)
  • 当我第一次读到这篇文章时,我理解了这样的理由,你可以查看一种方法,并知道它是公开的还是私人的.如果它是一个要求而不是一个惯例,那将会更有意义.因为如果一个团队中的一个程序员在不需要的地方添加一个下划线,或者使用下划线将公共一个下划线添加,那么你最终会感到很困惑.事实证明,这是来自PHP4,正如Jeremy指出的那样,&#ZF基于PEAR大会的惯例.梨已经删除它,我相信#ZF也会效仿. (4认同)

Sli*_*liq 40

现在,在2013年,这是PSR-2编码指南的"正式"坏风格:

属性名称不应以单个下划线为前缀,以表示受保护或私有可见性

资料来源:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

  • 根据"PSR-2" - >"不应该"意味着"不推荐"不被禁止在某些情况下这意味着可以接受.PSR Doc - > http://www.ietf.org/rfc/rfc2119.txt (6认同)

ump*_*sky 13

我坚决反对使用下划线为私有/受保护方法添加前缀,因为您可以使用private/protected关键字,IDE会为您标记它.

我仍然是,但是,我找到了一个可以成为一种好习惯的原因.想象一下,你有公共方法addFoo(),在那个方法里面你有一些与其他方法相同的任务部分addFooWhenBar(),addFooWhenBaz()......现在,这个常用方法的最佳名称是addFoo(),但它已经被采用了,所以你必须想出一些丑陋的名字喜欢addFooInternal()或者addFooCommon()......但_addFoo()私人方法看起来最好.


jon*_*ohn 12

主要下划线通常用于私有属性和方法.这不是我通常使用的技术,但在一些程序员中仍然很受欢迎.


Glo*_*ish 9

我在PHP 5类中使用了一个前导下划线,我为私有方法编写.这对开发人员来说是一个小的视觉提示,即特定的类成员是私有的.当使用区分公共和私有成员的IDE时,这种类型的提示不是很有用.我从C#天开始接收它.旧习惯......


Qui*_*son 5

我相信你的原始假设是正确的,我发现一些语言的常见做法是将下划线加到方法/成员等前面,这些方法/成员等意味着对"对象"保密.只是一种直观的方式来说,虽然你可以,你不应该称之为!


m.a*_*ito 5

我一直在寻找相同的答案,我做了一些研究,但我发现php框架建议使用不同的样式:

代码点火器

官方手册的编码样式部分鼓励这样做

私有方法和变量

仅在内部访问的方法和变量(例如,公用方法用于代码抽象的实用工具和帮助器函数)应带有下划线前缀。

public function convert_text()

private function _convert_text()
Run Code Online (Sandbox Code Playgroud)

其他框架也一样,例如

Cakephp:

做同样的事情

成员可见度

对方法和变量使用PHP5的private和protected关键字。此外,非公共方法或变量名称以单个下划线(_)开头。例:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

并且

做同样的事情

私人班级成员前面带有单个下划线。例如:

$_status    _sort()     _initTree()
Run Code Online (Sandbox Code Playgroud)

Drupal

代码风格对此特别警告

  1. 受保护的或私有的属性和方法不应使用下划线前缀。

交响乐

另一方面,声明

Symfony遵循PSR-0,PSR-1,PSR-2和PSR-4文档中定义的标准。