我正在寻求改进我的PHP编码,并想知道其他程序员使用什么特定于PHP的技术来提高生产力或解决PHP限制.
一些例子:
处理命名空间的类命名约定:Part1_Part2_ClassName
映射到文件Part1/Part2/ClassName.php
if ( count($arrayName) ) // handles $arrayName being unset or empty
变量函数名称,例如 $func = 'foo'; $func($bar); // calls foo($bar);
Preston.. 13
最后,在专注于特定于PHP的任何内容之前,通过学习一般良好的编程实践,您将首先充分利用PHP.话说回来...
foreach循环中的迭代器.几乎从来没有错误的时间.
围绕类自动加载设计.使用spl_autoload_register()
,而不是__autoload()
.对于奖励积分,让它以递归方式扫描目录树,然后随意将您的类重组为更逻辑的目录结构.
到处输入.对标量使用断言.
function f(SomeClass $x, array $y, $z) { assert(is_bool($z)) }
输出HTML以外的内容.
header('Content-type: text/xml'); // or text/css, application/pdf, or...
学习使用例外.编写一个错误处理程序,将错误转换为异常.
define()
用类常量替换全局常量.
用适当的Date
类替换你的Unix时间戳.
在长函数中,unset()
变量就完成了.
循环遍历对象的数据成员,如数组.感到内疚,他们没有被宣布为私人.这不是像Python或Lisp这样的异教徒语言.
使用输出缓冲区来组合长字符串.
ob_start(); echo "whatever\n"; debug_print_backtrace(); $s = ob_get_clean();
魔术方法(__get
,__set
,__call
)
extract()
结构化数组 - 使用对象
changelog.. 10
我在PHP方面的经验教会了我一些东西.仅举几例:
始终输出错误.这些是我典型项目的前两行(在开发模式下):
ini_set('display_errors', '1'); error_reporting(E_ALL);
永远不要使用自动化.像autoLoad这样的东西可能会在将来咬你.
始终要求使用依赖类require_once
.这样你就可以确定你的依赖关系是直的.
用if(isset($array[$key]))
而不是if($array[$key])
.如果未定义密钥,则第二个将发出警告.
定义变量时(即使是for
循环)给它们提供详细的名称($listIndex
而不是$j
)
评论,评论,评论.如果特定的代码片段看起来不明显,请发表评论.稍后你可能需要检查它,可能不记得它的目的是什么.
除此之外,类,函数和变量命名约定由您和您的团队决定.最近我一直在使用Zend Framework的命名约定,因为他们觉得我很对.
此外,当处于开发模式时,我设置了一个错误处理程序,它将在最轻微的错误(甚至是警告)时输出错误页面,从而为我提供完整的回溯.
最后,在专注于特定于PHP的任何内容之前,通过学习一般良好的编程实践,您将首先充分利用PHP.话说回来...
foreach循环中的迭代器.几乎从来没有错误的时间.
围绕类自动加载设计.使用spl_autoload_register()
,而不是__autoload()
.对于奖励积分,让它以递归方式扫描目录树,然后随意将您的类重组为更逻辑的目录结构.
到处输入.对标量使用断言.
function f(SomeClass $x, array $y, $z) { assert(is_bool($z)) }
输出HTML以外的内容.
header('Content-type: text/xml'); // or text/css, application/pdf, or...
学习使用例外.编写一个错误处理程序,将错误转换为异常.
define()
用类常量替换全局常量.
用适当的Date
类替换你的Unix时间戳.
在长函数中,unset()
变量就完成了.
循环遍历对象的数据成员,如数组.感到内疚,他们没有被宣布为私人.这不是像Python或Lisp这样的异教徒语言.
使用输出缓冲区来组合长字符串.
ob_start(); echo "whatever\n"; debug_print_backtrace(); $s = ob_get_clean();
魔术方法(__get
,__set
,__call
)
extract()
结构化数组 - 使用对象
我在PHP方面的经验教会了我一些东西.仅举几例:
始终输出错误.这些是我典型项目的前两行(在开发模式下):
ini_set('display_errors', '1'); error_reporting(E_ALL);
永远不要使用自动化.像autoLoad这样的东西可能会在将来咬你.
始终要求使用依赖类require_once
.这样你就可以确定你的依赖关系是直的.
用if(isset($array[$key]))
而不是if($array[$key])
.如果未定义密钥,则第二个将发出警告.
定义变量时(即使是for
循环)给它们提供详细的名称($listIndex
而不是$j
)
评论,评论,评论.如果特定的代码片段看起来不明显,请发表评论.稍后你可能需要检查它,可能不记得它的目的是什么.
除此之外,类,函数和变量命名约定由您和您的团队决定.最近我一直在使用Zend Framework的命名约定,因为他们觉得我很对.
此外,当处于开发模式时,我设置了一个错误处理程序,它将在最轻微的错误(甚至是警告)时输出错误页面,从而为我提供完整的回溯.
幸运的是,名称空间在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! }
永远是准确的.
看到这个问题:PHP的隐藏功能.它有很多非常有用的PHP技巧,其中最好的技巧已经浮出水面.