PHP类方法中的下划线是什么?

在查看各种PHP库时,我注意到很多人select用一个下划线前缀一些类方法,例如

public function _foo() 

…代替…

 public function foo() 

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

我的想法是,它可能是从PHP 4inheritance,在类方法可能被标记为受保护或私有之前,作为一种暗示“不要从课堂外调用此方法”的方式。 然而,我也想到,它可能起源于我不熟悉的某个地方(一种语言),或者可能有充分的理由使我从中受益。

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

这是从面向对象的PHP(PHP 4)的糟糕的旧时代。 面向对象的实现是相当糟糕的,并没有包括像私人方法的东西。 为了弥补,PHP开发人员开始使用一个下划线来私有的方法。 在一些较老的类中,你会看到/**private*/ __foo() {给它一些额外的权重。

我从来没有听说过开发者将所有的方法用下划线表示,所以我不能解释是什么原因导致的。

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

属性名称不能以一个下划线作为前缀来指示受保护的或私有的可见性。

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

属性名称不能以一个下划线作为前缀来指示受保护的或私有的可见性

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

主要的下划线通常用于私有属性和方法 。 不是我通常使用的技术,但仍然在一些程序员中stream行。

我强烈反对在私有/受保护的方法前加下划线,因为您可以使用私有/受保护的关键字,IDE将为您标记。

而我仍然是,但是,我find了一个可以成为一个好习惯的理由。 想象一下,你有公共方法addFoo() ,在这个方法里面有一些与其他方法addFooWhenBar()的任务的一部分addFooWhenBar()addFooWhenBaz() …现在,最常用的方法是addFoo()它已经被采用,所以你必须拿出一些丑陋的名字,如addFooInternal()addFooCommon()或…但_addFoo()私人方法看起来最好的一个。

我在私人方法编写的PHP 5类中使用了一个前导下划线。 这对开发者来说是一个小小的视觉提示,一个特定的class级成员是私人的。 当使用IDE来区分公共和私人成员时,这种暗示不是很有用。 我从C#日子里捡起来的。 旧习惯

我相信你原来的假设是正确的,我发现一些语言在下划线前面加上方法/成员等是为了保持“对象”的私有性。 只是一个可视的方式来说,尽pipe你可以,你不应该这样称呼!

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

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

在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中可以实现一个错误的钩子,这是非常糟糕的。

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>'; } 

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

我正在寻找相同的答案,我做了一些研究,我刚刚发现,PHP框架build议不同的风格:

代码点火器

官方手册有一个鼓励这种做法的编码风格部分 :

私有方法和variables

只能在内部访问的方法和variables(例如公用方法用于代码抽象的实用程序和辅助函数)应该以下划线作为前缀。

 public function convert_text() private function _convert_text() 

其他框架也是如此

CakePHP的:

也一样 :

会员可见度

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

 class A { protected $_iAmAProtectedVariable; protected function _iAmAProtectedMethod() { /* ... */ } private $_iAmAPrivateVariable; private function _iAmAPrivateMethod() { /* ... */ } } 

并且

也一样 :

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

 $_status _sort() _initTree() 

Drupal的

代码风格特别警告这个 :

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

交响乐

另一方面则宣称 :

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

使用下划线只是为了记忆目的,我们不会'修改variables'/'在外部调用函数'。

因为我们以全部大写forms声明constvariables,所以在查看variables名称的时候可以猜测它是一个constvariables。 类似于我们不想在课堂外修改的variables,我们用自己的约定用下划线来声明它。

他们被称为“魔法” 。