我正在寻求改进我的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);
答案 0 :(得分: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()
个全局常量。
将Unix时间戳替换为正确的Date
类。
在长函数中,unset()
变量完成后。
循环对象的数据成员,如数组。感到内疚,他们没有被宣布为私人。这不是像Python或Lisp那样的异教徒语言。
使用输出缓冲区组合长字符串。
ob_start();
echo "whatever\n";
debug_print_backtrace();
$s = ob_get_clean();
魔术方法(__get
,__set
,__call
)
extract()
结构化数组 - 使用对象
答案 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的。
使用数组汇编字符串。
很多字符串操作在PHP中都很昂贵,所以我倾向于编写算法来减少我做的字符串操作的离散数量。经典示例是使用循环构建字符串。相反,从数组()开始,并在循环中进行数组连接。然后在最后内爆()。 (这也巧妙地解决了逗号逗号问题。)
数组常量对于为函数实现命名参数非常有用。
答案 5 :(得分:4)
ini_set('display_errors', 1); error_reporting(E_ALL && $_STRICT);
答案 6 :(得分:3)
过去5年来,我一直在使用PHP(和MySQL)进行开发。最近我开始使用一个框架(Zend)和一个可靠的javascript库(Dojo),它改变了我的工作方式(我认为这是一种很好的方式)。
让我想起这件事是你的第一个问题:Zend框架正是这样做的,因为它是访问“控制器”和“行动”的标准方式。
在封装和抽象不同数据库的问题方面,Zend_Db非常好。 Dojo可以很好地解决不同浏览器之间的javascript不一致问题。
总的来说,值得深入了解OOP技术并使用(和READING ABOUT!)框架是了解OOP问题的一种非常实用的方法。
对于一些值得使用的独立工具,请参阅:
答案 7 :(得分:3)
答案 8 :(得分:3)
了解不同的类型和===
运算符,它对strpos()
等某些函数至关重要,您将自己开始使用return false
。