什么是有用的PHP成语?

时间:2008-10-28 13:04:47

标签: php conventions

我正在寻求改进我的PHP编码,并想知道其他程序员使用什么特定于PHP的技术来提高工作效率或解决PHP限制。

一些例子:

  1. 处理命名空间的类命名约定:Part1_Part2_ClassName映射到文件Part1/Part2/ClassName.php

  2. if ( count($arrayName) ) // handles $arrayName being unset or empty

  3. 变量函数名称,例如$func = 'foo'; $func($bar); // calls foo($bar);

9 个答案:

答案 0 :(得分:13)

最终,在专注于特定于PHP的任何内容之前,通过学习通常良好的编程实践,您将首先充分利用PHP。说完了......


为了娱乐和利益而大量申请:

  1. foreach循环中的迭代器。几乎从来没有错误的时间。

  2. 围绕班级自动加载设计。使用spl_autoload_register(),而不是__autoload()。对于奖励积分,让它以递归方式扫描目录树,然后随意将您的类重组为更合理的目录结构。

  3. 随处打字。对标量使用断言。

    function f(SomeClass $x, array $y, $z) {
        assert(is_bool($z))
    }
    
  4. 输出HTML以外的内容。

    header('Content-type: text/xml'); // or text/css, application/pdf, or...
    
  5. 学习使用例外。编写一个错误处理程序,将错误转换为异常。

  6. 用类常量替换define()个全局常量。

  7. 将Unix时间戳替换为正确的Date类。

  8. 在长函数中,unset()变量完成后。


  9. 谨慎使用:

    1. 循环对象的数据成员,如数组。感到内疚,他们没有被宣布为私人。这不是像Python或Lisp那样的异教徒语言。

    2. 使用输出缓冲区组合长字符串。

      ob_start();
      echo "whatever\n";
      debug_print_backtrace();
      $s = ob_get_clean();
      

    3. 除非绝对必要,否则可能会避免,除非你真的讨厌维护程序员和你自己:

      1. 魔术方法(__get__set__call

      2. extract()

      3. 结构化数组 - 使用对象

答案 1 :(得分:10)

我的PHP经验教会了我一些东西。仅举几例:

  • 始终输出错误。这些是我典型项目的前两行(在开发模式中):
ini_set('display_errors', '1');
error_reporting(E_ALL);
  • 切勿使用 automagic 。像autoLoad这样的东西可能会在将来咬你。

  • 始终要求使用require_once的依赖类。通过这种方式,您可以确保直接拥有自己的依赖关系。

  • 使用if(isset($array[$key]))代替if($array[$key])。如果没有定义密钥,第二个将发出警告。

  • 定义变量时(即使使用for个周期),请给出详细的名称($listIndex而不是$j

  • 评论,评论,评论。如果特定的代码片段看起来不明显,请发表评论。稍后你可能需要检查它,可能不记得它的目的是什么。

除此之外,类,功能和变量命名约定由您和您的团队决定。最近我一直在使用Zend Framework's naming conventions,因为他们对我很好。

此外,在开发模式下,我设置了一个错误处理程序,它会在最轻微的错误(甚至是警告)时输出错误页面,给我full backtrace

答案 2 :(得分:5)

幸运的是,名称空间在5.3和6中。我强烈建议不要使用Path_To_ClassName惯用法。它会产生混乱的代码,你永远不会改变你的库结构......

SPL的自动加载很棒。如果您有条理,它可以为您节省典型的20行包含块,并且需要在每个文件的顶部。您也可以在代码库中更改内容,只要PHP可以从这些目录中包含,就不会有任何中断。

自由使用===而不是==。例如:

if (array_search('needle',$array) == false) {
  // it's not there, i think...
}
如果'needle'处于关键零点,

将给出假阴性。代替:

if (array_search('needle',$array) === false) {
  // it's not there!
}

永远是准确的。

答案 3 :(得分:5)

请参阅此问题:Hidden Features of PHP。它有很多非常有用的PHP技巧,其中最好的技巧已经浮出水面。

答案 4 :(得分:4)

我在PHP中做的一些事情往往是特定于PHP的。

  1. 使用数组汇编字符串。

    很多字符串操作在PHP中都很昂贵,所以我倾向于编写算法来减少我做的字符串操作的离散数量。经典示例是使用循环构建字符串。相反,从数组()开始,并在循环中进行数组连接。然后在最后内爆()。 (这也巧妙地解决了逗号逗号问题。)

  2. 数组常量对于为函数实现命名参数非常有用。

答案 5 :(得分:4)

  1. 启用通知,如果您真的想要STRICT错误报告。它可以防止很多错误和代码异味:ini_set('display_errors', 1); error_reporting(E_ALL && $_STRICT);
  2. 远离全局变量
  3. 保持尽可能多的功能。它读起来更容易,而且易于维护。有些人说你应该能够在你的屏幕上看到整个功能,或者至少,功能中的循环和结构的开始和结束花括号都应该在你的屏幕上。
  4. 不信任用户输入!

答案 6 :(得分:3)

过去5年来,我一直在使用PHP(和MySQL)进行开发。最近我开始使用一个框架(Zend)和一个可靠的javascript库(Dojo),它改变了我的工作方式(我认为这是一种很好的方式)。

让我想起这件事是你的第一个问题:Zend框架正是这样做的,因为它是访问“控制器”和“行动”的标准方式。

在封装和抽象不同数据库的问题方面,Zend_Db非常好。 Dojo可以很好地解决不同浏览器之间的javascript不一致问题。

总的来说,值得深入了解OOP技术并使用(和READING ABOUT!)框架是了解OOP问题的一种非常实用的方法。

对于一些值得使用的独立工具,请参阅:

Smarty(模板引擎) ADODB(数据库访问抽象)

答案 7 :(得分:3)

在使用变量之前声明变量!

答案 8 :(得分:3)

了解不同的类型和===运算符,它对strpos()等某些函数至关重要,您将自己开始使用return false