我什么时候应该在 PHP 命名中使用 camelCase / Camel Case 或下划线?
When should I use camelCase / Camel Case or underscores in PHP naming?
我一直在学习 PHP,发现人们命名事物的方式有很多差异。我渴望至少与自己保持一致。
我应该在哪里使用驼峰式大小写以及我应该在哪里使用下划线?
想法:
变量/属性:$userid
或$user_id
或$userID
类: MyCustomClass
或 myCustomClass
函数/方法:my_custom_function()
或my_Custom_Function()
任何想法表示赞赏。
来自PSR基本编码标准(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
Class names MUST be declared in StudlyCaps (ie: PascalCase).
Class constants MUST be declared in all upper case with underscore
separators.
Method names MUST be declared in camelCase.
This guide intentionally avoids any recommendation regarding the use
of $StudlyCaps, $camelCase, or $under_score property names.
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
private $StudlyCapsProp = null;
protected $camelCaseProp = null;
public $under_score_prop = null;
public function fooBar()
{
}
}
许多人有许多不同的偏好,而且在大多数情况下,他们通常只是偏好。除了它是人们习惯的或它很受欢迎之外,很少有关于为什么普通人喜欢特定风格的原因。不幸的是,当涉及到更实际的问题时,这往往不会让您了解 为什么 使用任何特定的约定。
许多人都依赖 PSR,它简化了必须建立约定的任务。在任何开发团队中,都应建立约定以简化一致性。与自己动手相比,PSR 可以节省一些时间。虽然这是一个有用的开始,但您不应该觉得 PSR 建议是权威的。如何编写 PHP 最终取决于您,但如果您是从头开始,则应首先调查其他人是如何编写的。这并不意味着您必须以同样的方式进行操作,但这是一个开始。
PSR 有一定的局限性:
- 它是通过共识建立的,而不是任何特定的科学,这意味着它往往不一致。
- 它并不完全彻底。您最终会发现它没有指定任何选项的情况。
- 它最初是为了提高框架之间的兼容性,但现在它包括品味问题而不是兼容性问题。在很多情况下,您使用哪种约定对兼容性的影响与您的袜子颜色对它们适合您的脚的影响一样大。
- 即使不是大多数项目,框架之间的兼容性往往很少或不重要。特别是对于闭源商业项目。
- 它们纯粹是来自非官方第三方的建议。有人可能更喜欢逆时针搅拌他们的咖啡并在互联网上推荐,但实际上你搅拌的方向取决于你或你所在的团队。星巴克、Nero 和 Costa 可能会发表联合声明,建议你顺时针搅拌,但你不想听就不必听。
撇开这一点不谈,驼峰式 (camel) 和蛇式 (snake) 之间存在一些语义和实际差异。
最直接的区别是camel少用一个字符来分隔单词;它更紧凑。如果您将 object 转换为 JSON 然后将其压缩以发送到浏览器,则情况可能并非总是如此。虽然在大多数情况下差异可以忽略不计,但在某些情况下骆驼会或多或少地压缩效率。您不必为此担心。总的来说,两者之间的整体性能差异非常微不足道。
从人的角度和程序的角度来看,紧凑是有代价的。分离和使用术语可能更加困难。在再次压缩文件之前,我们解压缩文件以对其进行处理是有原因的,尽管此处适用的相同原则更为微妙,但紧凑更难。从某种意义上说,它也是有损的,即定界符会改变字符。这很不方便,因为它并不总是适用于第一个字符。您不能简单地按案例拆分和加入。其中一个重要的原因是动态访问或元编码,其中属性和方法可能会自动确定,例如通过组装一组令牌。
如果我创建了一个生成器,它会自动创建 objects 来表示数据库中的表并用作存储库,那么我可能会在该 class 上生成方法,以便能够通过每一列。我可能正在查看 get_by_username|get_by_email
或 getByUsername|getByEmail
。
如果我有 (get_by|getBy)($field, $value)
那么我会为该字段传递用户名或电子邮件,这些是原始表格。在这种情况下,我必须在创建 class 时 ucfirst
每个字段。更进一步,如果我通过 __call
动态提供这些内容会怎样?在这种情况下,每次我需要至少使用 lcfirst
转换骆驼,而使用蛇形外壳时,我所要做的就是将它固定到字符串的末尾,它可以一对一映射而无需转换或担心所以如果它在结尾或开头,则很多。考虑将两个字段(例如操作和字段)映射到 class 成员:
- lcfirst 如果附加或大写,按大小写拆分,将 lcfirst 映射到第二个
- 拆分,将 ucfirst 映射到所有,否则附加到 rest,concat
对比:
- 拆分
- 加入
默认情况下,Snake 会保留其原始形式的标记,否则它往往更容易单独转换容易分离的单词。
在 PHP 中使用元编码以充分利用它是很常见的,这将包括大量基于字符串的运行时多态性。你很可能最终会遇到这样一种情况,你会发现蛇比你想要的骆驼有更多的好处o 动态编码。
ifCamelCaseWereReallyThatGreatEveryoneWouldBeAnsweringProgrammingQuestionsOnWhosebugLikeThis。 asYouCanSeeForAnythingButTheShortestPhrasesShortFormQuicklyBecomesTiring。你通常可以在编程中摆脱它,就像它在小剂量和在白色空间中一样。驼峰式大小写的另一个烦恼是当你有缩写或单字母单词时。 itNotAllGood.
在语义上,人们也倾向于使用 snake 命名空间,而不是将其与短语一起使用。相反,骆驼倾向于用于按顺序或作为标题以简单英语阅读的小短语或句子。这在 OOP 中尤为常见,其中 classname 倾向于提供第一个也是最常需要的分类层,并且今天倾向于越来越多地允许嵌套名称空间(在 PHP 中完全支持)。如果您要明确地做某事,即按顺序组合来自不同类别的集合中的单词,而不是组合英语中的单词来创建短语,那么惯例是使用 snake。在这种情况下,您更有可能发现自己在进行元编码。
例如 database_statement_row_read_next()
不完全是一个有效或典型的英语短语。其中 as Database\Statement::readNextRow
最后成为有效且标准的英语表达式。
虽然英语比较顺手和熟悉,但也存在一定的问题。事情并不总是以相同的顺序或以相同的方式说出来(这是不一致的),这再次可能使元编码变得更加尴尬,在元编码中很自然地处理单词集并将它们组合起来而不用担心有时需要两个而不是一个单词、顺序或单词、短语轮换等
如果您根据经验将姓名写成简单英语的片段,您应该主要使用驼峰,因为这是压倒性的惯例。如果您不严格关心单词的顺序与它们在英语中的顺序相匹配,但关心分类和组织,那么明确的分隔符往往是标准。
关于骆驼,他们没有告诉您的是,按照惯例,您几乎总是希望在编写它的同时还要遵守英语语法规则,这些规则在偶尔的情况下并不总是锻炼和分类命名。
更正确的术语是:
- 下划线分隔 = alpha_beta
- 大小写分隔 = alphaBeta
- 大写字母分隔 = AlphaBeta
在最后一种情况下,第一个大写字母不定界。
在编程世界中,一般用例分隔(大写和非大写的混合)往往是 OOP 的标准。一般来说,您最终也会更一致地坚持 PHP 中的那个,尤其是对于任何与 OOP 相关的名称,例如方法。
相反,对于过程变量、函数变量和局部变量,流行语言中使用 snake 的趋势相当强烈。
无论您选择什么,都尽量保持一致,如果有差异,您应该有理由和约定。如果你将两者混合,那么你可以将一个放在立面后面。 Camel 倾向于供人类消费,并被解读为有效的英语,而如果需要元编码,则 snake 可能是您可以嵌套在外观后面的东西。
特别针对您的提案:
变量/属性:
userid
将变得难以阅读并且最终会创建其他单词。也无法将其翻译成另一种标准格式。
user_id
可以。
userId
可以
userID
不好。它将转换为 user_i_d 而不是 user_id.
类:
MyCustomClass
是一个通用且非常一致的标准,这也是有意义的,因为 class名称是标题,应该大写。
myCustomClass
可能会让它看起来像是有人在打算放置一个 class 名称时放置了一个方法。
函数/方法:
my_custom_function
这是最简单的事情(在合理范围内),尽管不遵循不遵守英语语法但使用它命名空间的英语单词的惯例,你可以称之为 function_custom
或 function_default
.
my_Custom_Function
并不是最简单的可行方法。大写是多余的,没有任何用处,它揭示了专用字符分隔的隐藏好处,它可以保留大小写。
有些人可能会被诱骗使用两者来提供一层或多层嵌套。无论你为此做什么,它最终都会变得丑陋。它与 CSV 中的 CSV 或二维数组的概念相同。 camel 和 snake 都用于表示单个单词的数组。如果你想表示两个单词数组,那么你需要一些特殊的东西,比如两个或更多的组合一个分隔符,其中可能包含一个多字符分隔符。如果您处于那种情况,很可能是 YAGNI,因为在实践中,骆驼或蛇本身几乎总是足够的。如果您要将它们混合起来,那应该是策略的一部分,而不仅仅是肤浅的、有记录的或显而易见的。
一个相关的例子可能是 get_by_username|get_by_email
案例。我可能会决定总是 [$operation, $field]
。操作和字段可能都需要用一个以上的词来描述。这可能会导致在现场和操作中使用骆驼,而在现场和操作中使用蛇。这将给出例如 getBy_username
、deleteBy_username
或 getBy_firstName
。它并不漂亮,但可能会被争论为服务于实际目的。以 snake 开头以提供命名空间然后以 camel 结尾也有些常见,这本质上是您使用 OOP 命名空间、classes 和方法所获得的。如果有充分的理由,将事情混在一起并没有错,但通常情况下,像这样的混合风格往往会变成一种糟糕的代码气味,导致你去厕所不冲水。
根据我们使用的框架,它可能会有所不同。我们应该遵循我们用来开发应用程序的框架所遵循的命名约定。
每个框架都遵循不同的命名约定。示例:
- Zend 不允许下划线
- Symfony 也鼓励 camelCase
- Wordpress 鼓励下划线,不喜欢驼峰式
- CodeIgniter 也支持下划线
因此:使用您的框架使用的任何名称或创建您自己的命名约定。
但是对于 PHP 开发人员的基本命名约定,我发现这个可以使用。
对于变量
我们可以使用小写下划线。喜欢
$first_name = "John";
$last_name = "Doe";
(大多数 php 开发人员和像 LV 这样的框架都使用这个。wordpress 也使用这个命名约定来声明变量。)
对于常量
我们可以使用全部大写。喜欢
define('DB_HOST', 'localhost');
define('DB_USER', 'db_user');
(大多数 php 开发人员和框架以及 CMS 使用此命名约定来声明 php 常量。)
对于Class姓名
我们可以使用 Pascal 大小写。喜欢
class UserDetails {
//
}
(PHP 像 LV 这样的框架使用这个约定,许多 php 开发人员使用这个命名约定。)
对于函数和Class方法名称
我们可以使用驼峰式大小写。喜欢
function getName() {
// Do something
}
(PHP 像 LV 这样的框架使用这个约定,许多 php 开发人员使用这个命名约定。)
注:但是wordpress是按照小写under_score来声明函数的
function get_name() {
// Do something
}
您可以获得更多详细信息here。
我一直在学习 PHP,发现人们命名事物的方式有很多差异。我渴望至少与自己保持一致。
我应该在哪里使用驼峰式大小写以及我应该在哪里使用下划线?
想法:
变量/属性:
$userid
或$user_id
或$userID
类:
MyCustomClass
或myCustomClass
函数/方法:
my_custom_function()
或my_Custom_Function()
任何想法表示赞赏。
来自PSR基本编码标准(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
Class names MUST be declared in StudlyCaps (ie: PascalCase).
Class constants MUST be declared in all upper case with underscore separators.
Method names MUST be declared in camelCase.
This guide intentionally avoids any recommendation regarding the use of $StudlyCaps, $camelCase, or $under_score property names.
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
private $StudlyCapsProp = null;
protected $camelCaseProp = null;
public $under_score_prop = null;
public function fooBar()
{
}
}
许多人有许多不同的偏好,而且在大多数情况下,他们通常只是偏好。除了它是人们习惯的或它很受欢迎之外,很少有关于为什么普通人喜欢特定风格的原因。不幸的是,当涉及到更实际的问题时,这往往不会让您了解 为什么 使用任何特定的约定。
许多人都依赖 PSR,它简化了必须建立约定的任务。在任何开发团队中,都应建立约定以简化一致性。与自己动手相比,PSR 可以节省一些时间。虽然这是一个有用的开始,但您不应该觉得 PSR 建议是权威的。如何编写 PHP 最终取决于您,但如果您是从头开始,则应首先调查其他人是如何编写的。这并不意味着您必须以同样的方式进行操作,但这是一个开始。
PSR 有一定的局限性:
- 它是通过共识建立的,而不是任何特定的科学,这意味着它往往不一致。
- 它并不完全彻底。您最终会发现它没有指定任何选项的情况。
- 它最初是为了提高框架之间的兼容性,但现在它包括品味问题而不是兼容性问题。在很多情况下,您使用哪种约定对兼容性的影响与您的袜子颜色对它们适合您的脚的影响一样大。
- 即使不是大多数项目,框架之间的兼容性往往很少或不重要。特别是对于闭源商业项目。
- 它们纯粹是来自非官方第三方的建议。有人可能更喜欢逆时针搅拌他们的咖啡并在互联网上推荐,但实际上你搅拌的方向取决于你或你所在的团队。星巴克、Nero 和 Costa 可能会发表联合声明,建议你顺时针搅拌,但你不想听就不必听。
撇开这一点不谈,驼峰式 (camel) 和蛇式 (snake) 之间存在一些语义和实际差异。
最直接的区别是camel少用一个字符来分隔单词;它更紧凑。如果您将 object 转换为 JSON 然后将其压缩以发送到浏览器,则情况可能并非总是如此。虽然在大多数情况下差异可以忽略不计,但在某些情况下骆驼会或多或少地压缩效率。您不必为此担心。总的来说,两者之间的整体性能差异非常微不足道。
从人的角度和程序的角度来看,紧凑是有代价的。分离和使用术语可能更加困难。在再次压缩文件之前,我们解压缩文件以对其进行处理是有原因的,尽管此处适用的相同原则更为微妙,但紧凑更难。从某种意义上说,它也是有损的,即定界符会改变字符。这很不方便,因为它并不总是适用于第一个字符。您不能简单地按案例拆分和加入。其中一个重要的原因是动态访问或元编码,其中属性和方法可能会自动确定,例如通过组装一组令牌。
如果我创建了一个生成器,它会自动创建 objects 来表示数据库中的表并用作存储库,那么我可能会在该 class 上生成方法,以便能够通过每一列。我可能正在查看 get_by_username|get_by_email
或 getByUsername|getByEmail
。
如果我有 (get_by|getBy)($field, $value)
那么我会为该字段传递用户名或电子邮件,这些是原始表格。在这种情况下,我必须在创建 class 时 ucfirst
每个字段。更进一步,如果我通过 __call
动态提供这些内容会怎样?在这种情况下,每次我需要至少使用 lcfirst
转换骆驼,而使用蛇形外壳时,我所要做的就是将它固定到字符串的末尾,它可以一对一映射而无需转换或担心所以如果它在结尾或开头,则很多。考虑将两个字段(例如操作和字段)映射到 class 成员:
- lcfirst 如果附加或大写,按大小写拆分,将 lcfirst 映射到第二个
- 拆分,将 ucfirst 映射到所有,否则附加到 rest,concat
对比:
- 拆分
- 加入
默认情况下,Snake 会保留其原始形式的标记,否则它往往更容易单独转换容易分离的单词。
在 PHP 中使用元编码以充分利用它是很常见的,这将包括大量基于字符串的运行时多态性。你很可能最终会遇到这样一种情况,你会发现蛇比你想要的骆驼有更多的好处o 动态编码。
ifCamelCaseWereReallyThatGreatEveryoneWouldBeAnsweringProgrammingQuestionsOnWhosebugLikeThis。 asYouCanSeeForAnythingButTheShortestPhrasesShortFormQuicklyBecomesTiring。你通常可以在编程中摆脱它,就像它在小剂量和在白色空间中一样。驼峰式大小写的另一个烦恼是当你有缩写或单字母单词时。 itNotAllGood.
在语义上,人们也倾向于使用 snake 命名空间,而不是将其与短语一起使用。相反,骆驼倾向于用于按顺序或作为标题以简单英语阅读的小短语或句子。这在 OOP 中尤为常见,其中 classname 倾向于提供第一个也是最常需要的分类层,并且今天倾向于越来越多地允许嵌套名称空间(在 PHP 中完全支持)。如果您要明确地做某事,即按顺序组合来自不同类别的集合中的单词,而不是组合英语中的单词来创建短语,那么惯例是使用 snake。在这种情况下,您更有可能发现自己在进行元编码。
例如 database_statement_row_read_next()
不完全是一个有效或典型的英语短语。其中 as Database\Statement::readNextRow
最后成为有效且标准的英语表达式。
虽然英语比较顺手和熟悉,但也存在一定的问题。事情并不总是以相同的顺序或以相同的方式说出来(这是不一致的),这再次可能使元编码变得更加尴尬,在元编码中很自然地处理单词集并将它们组合起来而不用担心有时需要两个而不是一个单词、顺序或单词、短语轮换等
如果您根据经验将姓名写成简单英语的片段,您应该主要使用驼峰,因为这是压倒性的惯例。如果您不严格关心单词的顺序与它们在英语中的顺序相匹配,但关心分类和组织,那么明确的分隔符往往是标准。
关于骆驼,他们没有告诉您的是,按照惯例,您几乎总是希望在编写它的同时还要遵守英语语法规则,这些规则在偶尔的情况下并不总是锻炼和分类命名。
更正确的术语是:
- 下划线分隔 = alpha_beta
- 大小写分隔 = alphaBeta
- 大写字母分隔 = AlphaBeta
在最后一种情况下,第一个大写字母不定界。
在编程世界中,一般用例分隔(大写和非大写的混合)往往是 OOP 的标准。一般来说,您最终也会更一致地坚持 PHP 中的那个,尤其是对于任何与 OOP 相关的名称,例如方法。
相反,对于过程变量、函数变量和局部变量,流行语言中使用 snake 的趋势相当强烈。
无论您选择什么,都尽量保持一致,如果有差异,您应该有理由和约定。如果你将两者混合,那么你可以将一个放在立面后面。 Camel 倾向于供人类消费,并被解读为有效的英语,而如果需要元编码,则 snake 可能是您可以嵌套在外观后面的东西。
特别针对您的提案:
变量/属性:
userid
将变得难以阅读并且最终会创建其他单词。也无法将其翻译成另一种标准格式。user_id
可以。userId
可以userID
不好。它将转换为 user_i_d 而不是 user_id.
类:
MyCustomClass
是一个通用且非常一致的标准,这也是有意义的,因为 class名称是标题,应该大写。myCustomClass
可能会让它看起来像是有人在打算放置一个 class 名称时放置了一个方法。
函数/方法:
my_custom_function
这是最简单的事情(在合理范围内),尽管不遵循不遵守英语语法但使用它命名空间的英语单词的惯例,你可以称之为function_custom
或function_default
.my_Custom_Function
并不是最简单的可行方法。大写是多余的,没有任何用处,它揭示了专用字符分隔的隐藏好处,它可以保留大小写。
有些人可能会被诱骗使用两者来提供一层或多层嵌套。无论你为此做什么,它最终都会变得丑陋。它与 CSV 中的 CSV 或二维数组的概念相同。 camel 和 snake 都用于表示单个单词的数组。如果你想表示两个单词数组,那么你需要一些特殊的东西,比如两个或更多的组合一个分隔符,其中可能包含一个多字符分隔符。如果您处于那种情况,很可能是 YAGNI,因为在实践中,骆驼或蛇本身几乎总是足够的。如果您要将它们混合起来,那应该是策略的一部分,而不仅仅是肤浅的、有记录的或显而易见的。
一个相关的例子可能是 get_by_username|get_by_email
案例。我可能会决定总是 [$operation, $field]
。操作和字段可能都需要用一个以上的词来描述。这可能会导致在现场和操作中使用骆驼,而在现场和操作中使用蛇。这将给出例如 getBy_username
、deleteBy_username
或 getBy_firstName
。它并不漂亮,但可能会被争论为服务于实际目的。以 snake 开头以提供命名空间然后以 camel 结尾也有些常见,这本质上是您使用 OOP 命名空间、classes 和方法所获得的。如果有充分的理由,将事情混在一起并没有错,但通常情况下,像这样的混合风格往往会变成一种糟糕的代码气味,导致你去厕所不冲水。
根据我们使用的框架,它可能会有所不同。我们应该遵循我们用来开发应用程序的框架所遵循的命名约定。
每个框架都遵循不同的命名约定。示例:
- Zend 不允许下划线
- Symfony 也鼓励 camelCase
- Wordpress 鼓励下划线,不喜欢驼峰式
- CodeIgniter 也支持下划线
因此:使用您的框架使用的任何名称或创建您自己的命名约定。
但是对于 PHP 开发人员的基本命名约定,我发现这个可以使用。
对于变量
我们可以使用小写下划线。喜欢
$first_name = "John";
$last_name = "Doe";
(大多数 php 开发人员和像 LV 这样的框架都使用这个。wordpress 也使用这个命名约定来声明变量。)
对于常量
我们可以使用全部大写。喜欢
define('DB_HOST', 'localhost');
define('DB_USER', 'db_user');
(大多数 php 开发人员和框架以及 CMS 使用此命名约定来声明 php 常量。)
对于Class姓名
我们可以使用 Pascal 大小写。喜欢
class UserDetails {
//
}
(PHP 像 LV 这样的框架使用这个约定,许多 php 开发人员使用这个命名约定。)
对于函数和Class方法名称
我们可以使用驼峰式大小写。喜欢
function getName() {
// Do something
}
(PHP 像 LV 这样的框架使用这个约定,许多 php 开发人员使用这个命名约定。)
注:但是wordpress是按照小写under_score来声明函数的
function get_name() {
// Do something
}
您可以获得更多详细信息here。