如何开始使用 PHP 的替代匈牙利命名法(PAHN)

匈牙利命名法是一种编程语言变量命名约定。自1999年匈牙利的查尔斯·西莫尼(Charles Simonyi)提出该命名法以来,许多人尝试将其应用于各种新的编程语言。匈牙利命名法不仅有助于理解变量的用途,还可以指明变量内部预期的数据类型。

对于 PHP,PHP 替代匈牙利命名法(PAHN)是基于匈牙利命名法的一种简化版本,并且考虑到 PHP 语言与西莫尼使用的语言之间的差异。

优势

  1. 提高可读性
    通过为变量采用与函数、类方法或类变量不同的命名约定,可以帮助提高代码的可读性,避免混淆。例如,避免将变量与函数调用混淆。

  2. 帮助其他程序员理解意图
    使用命名约定可以让其他程序员快速理解变量的用途。

  3. 保持一致性
    采用像 PAHN 这样简单且易学的标准,可以确保多个团队成员的代码风格一致,避免一个成员使用一种变量命名约定,另一个成员使用另一种。

  4. 解决命名标准的缺乏
    PHP 基于变量命名约定的标准较少,PAHN 提供了一个参考文档,方便大家共同遵循。

  5. 区分不同类型的变量
    比如 $sMemberID 表示可能是字母数字的 ID,而 $nMemberID 表示整型 ID。使用命名约定可以提升代码可读性。

  6. 改善代码的可读性
    例如,$NamesArray 可能让人不确定它是包含 Names 对象的数组,还是包含 Names 字符串的数组。使用命名约定后,可以通过 $asNames 来明确表示是 Names 字符串的数组。

指南

PAHN 变量命名约定的前缀由一系列字符组成,后接一个标准大小写的变量名。例如:

global $gasNames;
$gasNames = $Members->getNames();

在这个例子中,$gasNames 代表的是一个 global(全局)+ array(数组)+ string(字符串)的变量。

常用前缀

  • _ = 私有类变量
  • a+ = 数组(通常与数组内的数据类型结合)
  • c+ = 字符
  • s+ = 字符串
  • o+ = 对象
  • d+ = 日期对象(如 date()gmdate() 返回的结果)
  • v+ = 变体(非常少用,表示任何可能的变量类型)
  • i+ = 整数
  • f+ = 浮动点数
  • n+ = 数字(不确定是浮动点还是整数,使用时要谨慎)
  • x+ = 表示这是一个按引用传递的变量
  • rs+ = 数据库记录集(行集)
  • rw+ = 数据库行
  • h+ = 句柄(如数据库句柄、文件句柄等)
  • hf = 函数句柄(如 setRetrievalStrategy(callable $hfStrategy)
  • t+ = 线程化对象(表示该对象可以安全地在线程之间调用或传递)
  • g+ = 全局变量(使用时要谨慎,通常与变量的类型结合)
  • b+ = 布尔值

示例

  • $oMember -- 一个 Member 对象
  • $hFile -- 文件句柄,例如通过 fopen() 传递的句柄
  • $cFirst -- 从字符串中提取的第一个字符
  • $rsMembers -- 从数据库表返回的 Members 记录
  • $rwMember -- 从数据库中获取的单个 Member 记录
  • $bUseNow -- 布尔标志
  • $sxMemberName -- 按引用传递的字符串变量,表示成员名称
  • $nCounter -- 数字计数器
  • $dBegin -- 起始日期
  • $sFirstName -- 表示某人名字的字符串
  • $_hDB -- 存储数据库连接句柄的私有类变量(通常通过 $this->_hDB 访问)

对于类变量名,PAHN 不使用这些前缀。例如,你可能会看到类似以下的代码:

$Members = new Members();

对于常量,PAHN 只使用大写单词,如 MEMBER,并且通常只在 PHP 替代语法(CCAPS)中插入变量。

变量命名的其他规则

  • 使用标准大小写(ProperCase)
    例如,$sMemberName 应该使用标准大小写,而不是 $sMEMBERNAME$sMember_Name$smemberName。这样可以避免将变量误认为常量(通常常量是大写的)。$sMember_Name$s_Member_Name 增加了不必要的打字工作,而 $smemberName 则使变量名变得混淆。

  • 少数特殊情况
    在一些特殊情况下,添加下划线会提高可读性,例如使用首字母缩写(如 FIFO)时,$bFIFO_Indicator$bFIFOIndicator 更容易理解。

  • 循环迭代器的例外
    对于循环迭代器变量,通常使用简短的变量名(如 $i$x$y 等),这不仅节省了打字,还能提高代码的简洁性和可读性。例如:

    $asMemberNames = array();
    for ($i = 1; $i <= 10; $i++) {
      $asMemberNames[$i-1] = $Member->getMemberByID($i);
    }
    

在这种情况下,使用简短的命名有助于减少打字量,同时保持代码的可读性。

最后修改: 2025年01月10日 星期五 03:17