编码风格 - PHP类方法中领先的下划线有什么用?
在查看各种PHP库时,我注意到很多人选择使用单个下划线为某些类方法添加前缀,例如
public function _foo()
...代替...
public function foo()
我意识到这最终归结为个人偏好,但我想知道是否有人对这种习惯的来源有所了解。
我的想法是,它可能是从PHP 4继承的,在类方法可以被标记为受保护或私有之前,作为暗示“不要从类外调用此方法”的一种方式。 然而,我也想到它可能起源于我不熟悉的某个地方(一种语言),或者背后可能有很好的推理,我会从中获益。
任何想法,见解和/或意见将不胜感激。
nocash asked 2019-05-19T17:38:22Z
14个解决方案
136 votes
这是面向对象PHP(PHP 4)的旧时代。 面向对象的实现非常糟糕,并没有包括私有方法之类的东西。 为了弥补这一点,PHP开发人员开始使用下划线表示私有的方法。 在一些较旧的课程中,你会看到/**private*/ __foo() {给它一些额外的重量。
我从来没有听说开发人员用下划线填充所有方法,所以我无法解释导致这种情况的原因。
Jeremy DeGroot answered 2019-05-19T17:38:41Z
64 votes
我相信现在这类PHP约定的最权威来源是PSR-2:编码风格指南,因为Zend框架是PSR的一部分:
属性名称不应以单个下划线为前缀,以指示受保护或私有可见性。
joedevon answered 2019-05-19T17:39:13Z
35 votes
现在,在2013年,这是PSR-2编码指南的“正式”坏风格:
属性名称不应以单个下划线为前缀,以表示受保护或私有可见性
资料来源:[https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md]
Sliq answered 2019-05-19T17:39:53Z
11 votes
主要下划线通常用于私有属性和方法。 这不是我通常使用的技术,但在一些程序员中仍然很受欢迎。
jonstjohn answered 2019-05-19T17:40:17Z
11 votes
我坚决反对使用下划线为私有/受保护方法添加前缀,因为您可以使用private / protected关键字,IDE会为您标记它。
我仍然是,但是,我找到了一个可以成为一种好习惯的原因。 想象一下,你有公共方法addFoo()并且在该方法中你有一些任务的一部分,这是常见的其他方法addFooWhenBar(),addFooWhenBaz() ...现在,这个常用方法的最佳名称是addFoo(),但它已经被采用,所以你必须 拿出一些丑陋的名字,如addFooInternal()或addFooCommon()或......但_addFoo()私有方法看起来最好的一个。
umpirsky answered 2019-05-19T17:40:52Z
8 votes
我在PHP 5类中使用了一个前导下划线,我为私有方法编写。 这对开发人员来说是一个小的视觉提示,即特定的类成员是私有的。 当使用区分公共和私有成员的IDE时,这种类型的提示不是很有用。 我从C#天开始接收它。 旧习惯......
GloryFish answered 2019-05-19T17:41:19Z
5 votes
我相信你原来的假设是正确的,我发现一些语言的常见做法是将下划线加到方法/成员等前面,这些方法/成员等意味着对“对象”保密。 只是一种直观的方式来说,虽然你可以,但你不应该称之为!
Quintin Robinson answered 2019-05-19T17:41:47Z
4 votes
我从python中知道它,其中用变量前缀加上下划线会导致编译器在实际变量名前面翻译一些随机的字母和数字序列。这意味着任何从类外部访问变量的尝试都会导致“变量未定义”错误。
我不知道这是否仍然是在python中使用的约定
Matthew answered 2019-05-19T17:42:21Z
3 votes
在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中工作的方式可能会错误地实现一个钩子,这非常糟糕。
maho answered 2019-05-19T17:43:02Z
3 votes
Drupal,并使用下划线:
一般来说,下划线是简单地标记一个函数可能只会被相关的父函数调用的事实......
function mymodule_tool($sting="page title"){
$out ='';
//do stuff
$out .= _mymodule_tool_decor($sting);
return $out;
}
function _mymodule_tool_decor($sting){
return '
'.$string.'
';}
当然,只是一个简单的例子......
user3613677 answered 2019-05-19T17:43:42Z
2 votes
我正在寻找相同的答案,我做了一些研究,我刚刚发现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的
代码风格特别警告:
受保护的或私有的属性和方法不应使用下划线前缀。
交响乐
另一方面,声明:
Symfony遵循PSR-0,PSR-1,PSR-2和PSR-4文档中定义的标准。
m.ardito answered 2019-05-19T17:46:18Z
0 votes
使用下划线只是为了记住我们不会“修改变量”/'在类外调用函数'。
因为我们以全部大写形式声明const变量,所以在看到变量的名称时可以猜测它是一个const变量。 类似于我们不想在类外部修改的变量,我们使用下划线为我们自己的约定声明它。
Tassawer answered 2019-05-19T17:46:52Z
0 votes
简单地在PHP类中使用单下划线和双下划线
class Name {
/* Property */
private $_name;
/* Construct */
function __construct($name) {
$this->_setName($name);
}
/* Set */
private function _setName($name) {
$this->_name = $name;
}
/* Get */
public function getName() {
return $his->_name;
}
}
antelove answered 2019-05-19T17:47:18Z
-19 votes
它们被称为“魔术方法”。
Tristan answered 2019-05-19T17:47:44Z