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

时间:2009-03-19 18:04:31

标签: php coding-style

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

public function _foo()

......而不是......

public function foo()

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

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

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

13 个答案:

答案 0 :(得分:143)

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

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

答案 1 :(得分:70)

我认为现在这类PHP约定的最权威来源是PSR-2: Coding Style Guide,因为Zend Framework是PSR的一部分:

  

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

答案 2 :(得分:39)

现在,在2013年,这是PSR-2编码指南的“正式”不良风格

  

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

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

答案 3 :(得分:12)

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

答案 4 :(得分:12)

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

我仍然是,但是,我找到了一个可以成为一种好习惯的原因。想象一下,你有公共方法addFoo(),并且在那个方法中,你有一些任务的一部分与其他方法addFooWhenBar()addFooWhenBaz()相同......现在,这个常用方法的最佳名称将是是addFoo(),但它已被采用,因此您必须提出一些丑陋的名称,例如addFooInternal()addFooCommon()或......但_addFoo()私有方法看起来最好

答案 5 :(得分:9)

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

答案 6 :(得分:5)

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

答案 7 :(得分:4)

我从python中知道它,其中用变量前缀加上下划线会导致编译器在实际变量名前面翻译一些随机的字母和数字序列。 这意味着任何从类外部访问变量的尝试都会导致“变量未定义”错误。

我不知道这是否仍然是在python中使用的约定,尽管

答案 8 :(得分:4)

我一直在寻找相同的答案,我做了一些研究,而且我刚刚发现php框架提出了不同的风格:

代码点火器

官方手册有coding style section that encourages this practice

  

私人方法和变量

     

仅在内部访问的方法和变量,例如公共方法用于代码抽象的实用程序和辅助函数,应该以下划线为前缀。

public function convert_text()

private function _convert_text()

其他框架也是如此,例如

<强> CakePHP的:

does the same

  

会员可见性

     

将PHP5的私有和受保护关键字用于方法和变量。此外,非公共方法或变量名称以单个下划线(_)开头。例如:

class A
{
    protected $_iAmAProtectedVariable;

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

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

PEAR

does the same

  

私人类成员前面有一个下划线。例如:

$_status    _sort()     _initTree()

虽然

<强> Drupal的

代码样式具体warns against this

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

<强>交响曲

另一方面,declares

  

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

答案 9 :(得分:3)

在Drupal(一个php CMS)中,下划线可用于防止调用钩子(https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7)。

如果我有一个名为“my_module”的模块并且想要命名一个函数my_module_insert,它将“挂钩”函数hook_insert。为了防止这种情况,我可以将我的函数重命名为_my_module_insert。

PS 钩子在Drupal中工作的方式可能会错误地实现一个钩子,这是非常糟糕的。

答案 10 :(得分:3)

Drupal,并使用下划线:

一般来说,下划线是简单地标记一个函数可能只会被相关的父函数调用的事实......

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

当然,只是一个简单的例子......

答案 11 :(得分:0)

使用下划线只是为了记住我们不会修改变量&#39; /&#39;调用函数&#39;课外。

因为我们以全部大写形式声明const变量,所以在看到变量的名称时可以猜测它是一个const变量。类似于我们不希望在类之外修改的变量,我们使用下划线为我们自己的约定声明它。

答案 12 :(得分:-20)

他们被称为"magic methods"