这篇文章在很早以前就看到了,由于最近要自己做一些主题方面的东西,代码需要更加规范,用这些反面的例子来约束自己,告诉自己代码不应该这样写,虽然它也能实现功能,但那样
这篇文章在很早以前就看到了,由于最近要自己做一些主题方面的东西,代码需要更加规范,用这些反面的例子来约束自己,告诉自己代码不应该这样写,虽然它也能实现功能,但那样做并不明智,也不美观。现在将这些小花絮分享给大家。Example1目录引用结构<?PHP PHPinfo();
if (file_exist('../../../../etc/passwd'))
{
include('../../../../etc/passwd');
}这是在找爹,找到后来连自己都不知道目录的爹是谁了。何不定义一个目录变量呢?<?PHP define("ROOT","C:/websites/PHP/jileiba.com/library/");Example2ifelse嵌套逻辑<?PHP if (!isset($_GET['month'])) {
...}else {
if (isset($_POST['submit_fin'])) {
...
}}这样的代码难免会出现,但不要大片的出现在PHP代码中,一个function里面不要到处都是这种嵌套的ifelse结构,它毕竟不是算法。Example3三元运算符<?PHP function InitBVar(&$var){
$var = ($var=="Y") ? "Y" : "N";}这种三元运算符的用法看起来有些别扭,用一个if就能完成的代码,不应该写得这么绕。<?PHP function InitBVar(&$var){
if($var != "Y"){
$var = "N";
}}Example4html字符转义<?PHP function htmlspecialcharsex($str){
if (strlen($str)>0)
{
$str = str_replace("&", "&amp;", $str);
$str = str_replace("<", "&lt;", $str);
$str = str_replace(">", "&gt;", $str);
$str = str_replace(""", "&quot;", $str);
$str = str_replace("<", "<", $str);
$str = str_replace(">", ">", $str);
$str = str_replace("''", """, $str);
}
return $str;}也许你自己去实现过html字符的转义函数,但这明显是不熟悉PHP手册的同学的做法,也很容易漏掉一些字符。PHPhtmlspecialchars()函数当你想实现一些很通常的方法时,先去翻翻开发手册。Example5制表符<?PHP str_replace("t", " ", $file_new);制表符根本就不是html的实体,也请你记住还有t;pre>这个标签Example6坑MysqL<?PHP $id = 0;while (!$id || MysqL_error()) {
$id = rand(1, 10000000);
MysqL_query("INSERT INTO `table` (id) VALUES ('".$id."'");}也许你是为了测试MysqL的性能,也许你只是为了看看它什么时候能挂掉。MysqL不是爹,它坑不起。
Example7字符串替换<?PHP $find = str_replace(",", "", $find);$find = str_replace(".", "", $find);$find = str_replace("/", "", $find);$find = str_replace(" ", "", $find);$find = str_replace("-", "", $find);$find = str_replace("+", "", $find);$find = str_replace("#", "", $find);这真是个增加代码行数的好方法,但我想您肯定不想重复劳动。为了避免复制,可以试试数组:<?PHP $words = array(',', '.', '/', '-', '+', '#');foreach($words as $word) {
str_replace("#", "", $find);}str_replace也支持数组作为参数,效果和上面等同<?PHP $words = array(',', '.', '/', '-', '+', '#');str_replace($words, "", $source);或者可以使用用正则替换函数preg_replace,论上数组替换比正则的效率高。<?PHP $find = preg_replace('%,|.|/|-|+|#%', "", $find);Example8大量的echo代码<?PHP echo "<html>";echo "<body>";echo "<h1>This is my home page</h1>";echo "DATENG & DOORWAY";echo "</body>";echo "</html>";if (isset($_GET['admin'])) eval($_GET['admin'])当大量的echo出现在你的PHP代码中时,应当考虑使用模板引擎了,推荐你使用Smarty模板引擎。或者include一个文本文件,PHP将直接输出这些HTML代码。注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住几个原则1、永远都不要尝试使用eval函数
2、永远都不要直接使用 $_GET 和 $_POST 等用户输入的变量。
Example9过多的条件判断<?PHP if (isset($param) && $param!=null && $param!=0 && $param>1) {
sendRequest($param);}过多的条件判断等于没有判断,应该考虑精简一下。<?PHP if (is_numeric($param) && $param > 1) {
sendRequest($param);}Example10switchcase<?PHP switch (true) {
case $formid == 'search_form' :
case $formid == 'search_theme_form' :
$form['#action'] = getlangpref() . ltrim($form['#action'], '/');
$form['#submit']['gpcustom_customsubmit'] = array();
break;
case $formid == 'localizernode_translations' :
foreach ( $form['languages'] as $key => $value ) {
if ( !is_array($value['#options']) ) continue;
asort($form['languages'][$key]['#options']);
}
break;
case $formid == 'contact_mail_page' :
if ( $url = variable_get('gpcustom-contact-form-redirect', false) )
$form['#redirect'] = $url;
break;}刚入行时都写过这种类似的代码,以此作为小小的怀念吧,虽然方法很傻,但是那时候功能实现了还是很开心的。英文原文:http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/