PHP 类方法中的前置下划线是怎么回事?

在查看各种 PHP 库时,我注意到许多人选择在一些类方法前加一个下划线,例如

public function _foo()

而不是..。

public function foo()

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

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

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

89233 次浏览

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

我相信你最初的假设是正确的,我发现有些语言的通常做法是在方法/成员等前面加一个下划线,这意味着对“对象”保持私有。只是一种直观的方式来说,虽然你可以,你不应该这样称呼它!

它来自面向对象 PHP (PHP4)糟糕的旧时代。OO 的实现非常糟糕,而且没有包括私有方法之类的东西。为了弥补这一缺陷,PHP 开发人员在方法前面加上了一个下划线,这些方法本来是私有的。在一些较老的类,你会看到 /**private*/ __foo() {给它一些额外的重量。

我从未听说过开发人员在所有方法前面都加下划线,所以我无法开始解释是什么导致了这种情况。

我在为私有方法编写的 PHP5类中使用了前导下划线。对于开发人员来说,这是一个很小的可视提示,表明某个特定类成员是私有的。在使用区分公共成员和私有成员的 IDE 时,这种类型的提示没有那么有用。我在 C 区的时候学的。老习惯了。

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

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

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

但我不知道这是否仍然是 Python 中使用的约定

它们被称为 “魔法”

我强烈反对在 private/protected 方法前加下划线,因为您可以使用 private/protected 关键字,IDE 会为您标记它。

我现在也是,但我找到了一个理由为什么这是个好的练习。假设你有一个公共方法 addFoo(),在这个方法里面有一些任务的一部分,这些任务和其他方法 addFooWhenBar()addFooWhenBaz()一样... ... 现在,这个公共方法的最佳名字应该是 addFoo(),但是它已经被使用了,所以你必须想出一些丑陋的名字,比如 addFooInternal()或者 addFooCommon()或者... ... 但是 _addFoo()私有方法看起来是最好的一个。

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

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

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

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

如果我有一个名为“ my _ module”的模块,并希望将函数命名为 my _ module _ insert,那么它将“ hook”到函数 hook _ insert 上。为了防止将函数重命名为 _ my _ module _ insert。

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

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 框架建议不同的风格:

密码点火器

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

私有方法和变量

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

public function convert_text()


private function _convert_text()

其他框架也是如此,比如

Cakephp:

做同样的事情 :

会员能见度

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

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文件中定义的标准。

使用下划线只是为了记住我们不会在类之外“修改变量”/“调用函数”。

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

这意味着此方法是私有的。

“我知道这最终取决于个人偏好,但我想知道是否有人对这种习惯的来源有一些见解。”它不应该是个人偏好,因为每种语言或框架都有自己的编码标准。一些 FW 编码标准使用 _ 来启动私有方法,而一些 FW 则不鼓励这样做。

你应该使用一个 FW 的编码标准,在其中你的程序。要检查代码是否符合编码标准,可以使用一个工具 PHP _ CodeSniffer: https://github.com/squizlabs/PHP_CodeSniffer

非常有用,检测与编码标准有关的错误。