1. 不要在SELECT查询中使用 * 在表中返回所有的字段,这会非常的慢。你只需要取出你需要的数据字段。如果你需要取出所有的字段,那么可能你的表需要更改了。
错误1:foreach循环后留下悬挂指针
foreach循环中使用 引用 更改迭代的元素 这样可以提高效率,但是记得循环结束后销毁引用,否则$value是数组中最后一个元素的引用,如果下面有用到这个变量的时候会出错
//例子:
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}//now array(2,4,6,8)
unset($value); // $value no longer references $arr[3]
错误2:对isset()函数行为的错误理解
isset($var); //当变量为null或者不存在时,返回false,所以,要是检查数组中某键是否存在时, bool array_key_exists ( mixed$key
, array $search
), array_key_exists() 在给定的 key
存在于数组中时返回 TRUE
。key
可以是任何能作为数组索引的值。array_key_exists() 也可用于对象。
错误5:内存使用低效和错觉
一次sql查询获取多条记录比每次查询获取一条记录效率肯定要高,但如果你使用的是php中的mysql扩展,那么一次获取多条记录就很可能会导致内存溢出。
为了避免此类问题,可以考虑分几次完成查询,减小单次查询数据量;
错误6:忽略Unicode/UTF-8问题
php编程中,在处理非ascii字符时,会遇到一些问题,要很小心的去对待,要不然就会错误遍地。
举个简单的例子,strlen($name),如果$name包含非ascii字符,那结果就有些出乎意料。在此给出一些建议,尽量避免此类问题:
- 如果你对unicode和utf-8不是很了解,那么你至少应该了解一些基础。推荐阅读这篇文章。
- 最好使用mb_*函数来处理字符串,避免使用老的字符串处理函数。这里要确保PHP的“multibyte”扩展已开启。
- 数据库和表最好使用unicode编码。
- 知道jason_code()函数会转换非ascii字符,但serialize()函数不会。
- php代码源文件最好使用不含bom的utf-8格式。
错误7:假定$_POST总是包含POST数据
// js
$.ajax({
url: ‘http://my.site/some/path‘,
method: ‘post‘,
data: JSON.stringify({a: ‘a‘, b: ‘b‘}),
contentType: ‘application/json‘
});
因为$_POST是全局变量,所以更改$_POST会全局有效。因此对于Content-Type为 application/json 的请求,我们需要手工去解析json数据,然后修改$_POST变量。
// php
$_POST = json_decode(file_get_contents(‘php://input‘), true);
此时,我们再去输出$_POST变量,则会得到我们期望的输出:
array(2) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" }
错误8:认为PHP支持字符数据类型
看看下面的代码,猜测下会输出什么:
for ($c = ‘a‘; $c <= ‘z‘; $c++) {
echo $c . "\n";
}
如果你的回答是输出’a‘到’z‘,那么你会惊奇的发现你的回答是错误的。
不错,上面的代码的确会输出’a‘到’z‘,但除此之外,还会输出’aa’到’yz’。我们来分析下为什么会是这样的结果。
在PHP中不存在char数据类型,只有string类型。明白这点,那么对’z‘进行递增操作,结果则为’aa’。对于字符串比较大小,学过C的应该都知道,’aa’是小于’z‘的。这也就解释了为何会有上面的输出结果。
如果我们想输出’a‘到’z‘,下面的实现是一种不错的办法:
$letters = range(‘a‘, ‘z‘);
for ($i = 0; $i < count($letters); $i++) {
echo $letters[$i] . "\n";
}
错误9:忽略编码标准
对于PHP开发者来说,是比较幸运的。因为有PHP编码标准推荐(PSR),由下面5个部分组成:
PSR-0:自动加载标准
PSR-1:基本编码标准
PSR-2:编码风格指南
PSR-3:日志接口标准
PSR-4:自动加载
错误10:错误使用empty()函数
检查一个数组是否为空最后的办法是用 count() 函数