摘录自: http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/ 是个好东西,但如其他的奇技淫巧一样, 如果使用不当很容易割伤自己。
同时需要注意的是, 自 PHP 5 起,new 自动返回引用,因 此在此使用 =&
已经过时了并且会产生 E_STRICT
级的消息。例如
$foo =& find_var($bar);
所以可以理解上面的 代码为何会出错 (同时这在 PHP4 中并不会!)。
随着「积木越搭越高」,有时这个问题可能会耗费你一个下午的时间,因此应尽量避免使用它。
Example 4.
function htmlspecialcharsex($str) {
if (strlen($str)>0) {
$str = str_replace("&", "&", $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;
}
类似的你可能自己实现过 json 、xml 等解析器,这都是在编码前没有 翻阅 PHP 手册 的缘故。
if (!function_exists('testfunc')) {
function testfunc() { }
}
如果你不确定将来的环境是否有对应的函数,那么你可以使用 function_exists 来判断。
Example 5.
str_replace("\t", " ", $file_new);
我知道你很迷惑为什么制表符不加入 HTML 实体中,但请你记住还有 <pre>
这个标签。同时如果想要调整间距, 那么 CSS 可能是你需要了解的。
Example 6.
$id = 0;
while (!$id || mysql_error()) {
$id = rand(1, 10000000);
mysql_query("INSERT INTO `table` (id) VALUES ('".$id."'");
}
MySQL 表示压力很大!
Example 7.
$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);
上面的代码如果你觉得复制粘贴非常累,那么可以考虑使用循环
$words = array(',', '.', '/', '-', '+', '#');
foreach($words as $word) {
str_replace("#", "", $find);
}
当然,如果知道还有正则这个玩意的话,那就更好了
$find = preg_replace('%\,|\.|\/|\-|\+|#%', "", $find);
Update
str_replace 其实也是可以用数组做为参数的, 类似这样:
str_replace(array(',',"."), "", $source);
理论上应该比用正则效率高。
by avenger
Example 8.
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 出现的时候,你就应该考虑是否需要个 模板引擎 了。 除此之外,简单的做法就是 include 个文本文件(请放心,PHP 会直接输出它的内容),然后再需要输出 变量的地方使用 PHP 标签。
注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住 几个原则 1、永远都不要尝试使用 eval 函数 2、永远都不要直接使用 $_GET
和 $_POST
等用户输入的 变量。
Example 9.
if (isset($param) && $param!=null && $param!=0 && $param>1) {
sendRequest($param);
}
过多的条件判断等于没有判断,上面的代码可以考虑下精简成下面这个样子
if (is_numeric($param) && $param > 1) {
sendRequest($param);
}
Example 10.
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;
}
偷个懒,这坨代码留给大家去优化吧,我想你们会做得更好的 :^) 各位有其他更糟糕的例子吗?欢迎提供。
-- EOF --
Example 7 的正则太麻烦了,为什么不用 [...] ?
例7中,str_replace 其实也是可以用数组做为参数的, 类似这样:str_replace(array(',',\".\"), \"\", $source); 理论上应该比用正则效率高。
都是哪一流的写法?
很不错的站点,虽然这篇文章不是原创!
但是我非常喜欢博主的文章。
呵呵。。支持。不懂。。
好文章,看了后,希望不會再寫出那些糟糕的代碼! :-)
写出Example 10的是一个神仙
Thanks big!
问博主:“让脚本接收 $_GET 和 $_POST 参数往往是混乱的开始” 这句很费解啊。
没文章可看了,快快更新吧
可能会因为过滤和使用用户数据不当引发安全方面的问题,参见 http://www.gracecode.com/archives/3029/
[...]http://www.gracecode.com/archives/3033/[...]
都能让人“眼前一亮”...
这家伙,太幽默了
误闯宝地,来留个脚印
Example 9.
你这个例子有点问题,isset($param)这个是需要判断的,如果$param不存在的话,直接用if (is_numeric($param) && $param > 1)会有notice
我很怀念你站点以前的。
http://lab.gracecode.com/format_json/ 页面。
已经移动到 http://lab.gracecode.com/json-formater/ 这里
in Example 7
Does you mean that:
str_replace(\"$word\", \"\", $find);$words = array(',', '.', '/', '-', '+', '#');
foreach($words as $word) {
}
Am I Right?
我看到代码头都大的。
其实PHP很有意思的哟!
我最怕这些个代码啦。
不错,收藏了,谢谢
用我们的方言讲,这些代码的不照
很受用,不愧是做过PHP程序员滴前TAOBAO前端
牛人啊,我对代码不感兴趣。
以前用PHP的飘过!
我也用过PHP,感觉不错
真不错哦,高手就是高手
最后一个 switch 用法深深的震撼了我。。。
太xx了