10

我希望改进我的 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);

4

9 回答 9

14

最终,您将首先通过学习一般良好的编程实践来充分利用 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. 用适当的Date类替换您的 Unix 时间戳。

  8. 在长函数中,unset()当你完成它们时,变量。


带着罪恶感使用:

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

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

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

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

  1. 魔术方法 ( __get, __set, __call)

  2. extract()

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

于 2008-10-29T03:07:07.217 回答
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 的命名约定,因为它们对我来说是正确的。

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

于 2008-10-28T13:19:34.250 回答
5

幸运的是,命名空间在 5.3 和 6 中。我强烈建议不要使用 Path_To_ClassName 习语。它使代码混乱,你永远不能改变你的图书馆结构......永远。

SPL 的自动加载很棒。如果您有条理,它可以为您节省典型的 20 行包含块和每个文件顶部的要求。您还可以在代码库中进行更改,只要 PHP 可以从这些目录中包含,就不会出现任何问题。

自由使用===over ==。例如:

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

如果“needle”在关键零处,将给出假阴性。反而:

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

将永远是准确的。

于 2008-10-28T13:36:47.930 回答
5

请参阅此问题:PHP 的隐藏功能。它有很多非常有用的 PHP 技巧,其中最好的已经排在列表的顶部。

于 2008-10-28T13:37:21.483 回答
4
  1. 启用 NOTICE,如果你真的想 STRICT 错误报告。它可以防止很多错误和代码异味:ini_set('display_errors', 1); error_reporting(E_ALL && $_STRICT);
  2. 远离全局变量
  3. 使尽可能多的函数保持简短。它更容易阅读,并且易于维护。有人说你应该可以在屏幕上看到整个函数,或者至少,函数中循环和结构的开始和结束大括号都应该在你的屏幕上
  4. 不要相信用户输入!
于 2008-10-29T12:17:17.510 回答
4

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

  1. 用数组组装字符串。

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

  2. 数组常量非常适合实现函数的命名参数。

于 2008-10-29T01:26:26.810 回答
3

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

让我想到这一点的是你的第一颗子弹:Zend 框架正是这样做的,因为它是访问“控制器”和“动作”的标准方式。

在封装和抽象不同数据库的问题方面,Zend_Db 做得很好。Dojo 在消除不同浏览器之间的 javascript 不一致方面做得非常出色。

总的来说,值得学习好的 OOP 技术和使用(和阅读!)框架是理解 OOP 问题的一种非常实用的方法。

有关一些值得使用的独立工具,另请参阅:

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

于 2008-10-28T14:18:14.913 回答
3

了解不同的类型和===运算符,这对于某些功能是必不可少的strpos(),您将开始return false自己使用。

于 2009-01-17T07:22:39.047 回答
3

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

于 2008-10-29T03:35:24.180 回答