PHP的命名
不好的命名
好的命名
命名的注意事项:
- 命名要有实际含义
- 命名风格保持一致
- 不用拼音命名
- 不用语言关键字
适当的使用注释
终极要求:代码就是注释
- 好的代码应该是自描述的
- 难以理解的地方加上注释
- 函数的功能加上注释说明
- 类的功能和使用方法加注释
多备份重要的代码
- 代码不能只有一份
- 启用编辑器的自动备份
- 用代码管理工具备份
坚持字符编码统一
PHP文件编码 == 模版编码 == 数据库编码
使用之前,变量要初始化
- function getInfo($arrId){
- $list[] = $info;
- }
- return $list;
- }
- function getInfo($arrId)
- {
- $list[] = $info;
- }
- return $list;
- }
使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!
可以想象, PHP引擎会首先按照正常的逻辑来获取这个变量, 然而这个变量不存在, 所以
PHP引擎需要抛出一个NOTICE, 并且进入一段使用未定义变量时应该走的逻辑, 然后返回
一个新的变量.
另外, 阅读代码的角度讲, 当你使用一个未定义的变量时, 会让阅读你代码的人困惑:”这
个变量在那里初始化的, 和之前的代码有关系么? 和include进来的文件有关系么?”
使用 NULL === 来代替 is_null
is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.
尽量使用 === 尽量不用 ==
PHP有俩组相等比较运算符 === / !== 和 == / != , == / != 会有隐式类型转换,
而 === / !== 会严格比较俩个操作时是否类型相同并且值相等.
避免在for循环中计算
- for($i=0; $i<strlen($str); $i++) {
- }
会导致每次循环都调用strlen, 改为
- for ($i=0; $i<$j; $i++) {
- }
strtr替代str_replace
- $subject = 'hello, world';
strtr函数的效率是str_replace的四倍
优先使用单引号
$row[‘id’] 的效率是 $row[id] 的7倍
header头的编码
header("Content-type: text/html;charset=utf-8");
php结束标记不要写
纯 PHP 代码,最好在文件末尾删除 PHP 结束标记
测试环境开启所有错误
error_reporting(7)
- 1:E_ERROR
- 2:E_WARNING
- 4:E_PARSE
但切记,上线之后要关闭我们的报错,将我们的错误代码写入到错误日志中,方便查错
屏蔽错误非常低效
养成不用 @ 的好习惯
用FALSE表示错误, 用NULL表示不存在
对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数,
如果找不到想要的值, 则应该返回NULL, 表示”找不到”.
优先使用PHP内置函数
正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:
有用的PHP内置函数
usort — 使用用户自定义的比较函数对数组中的值进行排序
rawurlencode — 按照 RFC 1738 对 URL 进行编码
parse_url — 解析 URL,返回其组成部分
http_build_query — 生成 URL-encode 之后的请求字符串
exif_imagetype — 判断一个图像的类型
uniqid — 生成一个唯一ID
get_browser — 获取浏览器具有的功能
str_word_count — 返回字符串中单词的使用情况
我们php手册中常见的字符串函数和数组函数,也需要熟悉,优先使用
防御式编程思想
不要相信外部的一切输入! 所有的输入都要检查!
使用PDO操作MySQL
- # 写法一
- $sql = "select * from chapter where id=:id";
- // 预处理 SQL 语句
- $res = $db->prepare($sql);
- // 执行 SQL
- if ($res->execute([":id" => 1])) {
- // 获取一行结果集
- $row = $res->fetch();
- } #
- # 写法二
- $sql = "select * from chapter where id=? and status=?";
- // 预处理 SQL 语句
- $res = $db->prepare($sql);
- // 执行一条预处理语句
- if ($res->execute([2, 1])) {
- // 获取一行结果集
- $row = $res->fetch();
- }