PHP编码习惯:
PHP的命名(驼峰法)
命名的注意事项:1.命名要有实际意义 2.命名风格要保持一致 3.不用拼音命名 4.不用语言关键字
不好的命名和好的命名对比:
bad:
function func1($var){ $a = strrpos($var,'.'); $b = substr($var,$a+1); return b; }
good:
function extName($fileName){ $dotPos = strrpos($fileName,'.'); $extName = substr($fileName,$doPos + 1); return $extName; }
使用一个未定义的变量,比使用一个定义好的变量要慢上8倍以上!代码实例:
bad:
function getInfo($arrId){ $ids = implode(',',$arrId); $query = mysql_query("select * from test where id in ($ids)"); while($info = mysql_fetch_array($query)){ $info['name'] = trim($info['name']); $info['addr'] = trim($info['addr']); } return $list; }
good:
function getInfo($arrId){ $list = array(); $ids = implode(',',$arrId); $query = mysql_query("select * from test where id in ($ids)"); while($info = mysql_fetch_array($query)){ $info['name'] = trim($info['name']); $info['addr'] = trim($info['addr']); } return $list; }
原理:php引擎会首先按照正常逻辑来获取这个变量,然而这个变量不存在,所以PHP引擎需要抛出一个NOTICE并且进入一段使用未定义变量时应该走的逻辑,然后返回一个新的变量。
使用 null === 来代替 is_null
is_null 和 null === 完全是一样的效果,但是却节省了一次函数调用.
尽量使用 === 尽量不用 ==
PHP有两组相等比较运算符 === / !== 和 == / != 会有隐式类型转换,而=== / !== 会严格比较两个操作时是否类型相同并且值相等。
避免再for循环中计算
bad:
for($i = 0; $i < strlen($str); $i){}
good:
$j = $strlen($str); for($i = 0; $i < $j; $i++){}
strtr替代str_replace
$subject = 'hello world'; echo strtr($subject,array('hello'=>'world','world'=>'hello')); echo str_replace(['hello'=>'world'],['world'=>hello],$subject);
strtr函数的效率是str_replace的四倍
测试一段代码到另一段执行时间代码:
function microtime_float(){ list($usec,$sec) = explode(" ",microtime()); return ((float)$usec * (float)$sec); } $time_start = microtime_float(); # 你要执行的 代码 $time_end = microtime_float(); $time = $time_end - time_start; echo "执行代码时间:".$time;
优先使用单引号:
$row['id']的效率是$row[id]的7倍
header头的编码
//定义编码 header( 'Content-Type:text/html;charset=utf-8 ');
php结束标记不要写
春PHP代码,最好再文件某尾删除PHP结束标记
测试环境开启所有错误
error_reporting(7) //官方文档链接: http://php.net/manual/zh/function.error-reporting.php
1 : E_ERROR
2:E_WARNING
4:E_PARSE
切记,上线之后要关闭我们的错误,将我们的错误代码写入到错误日志中,方便查询
代码例子:
ini_set('display_errors',false); if(in_array($_SERVER['WEIBO_ENV'],array('test','dev','local'))){ error_reporting(E_ALL & ~E_NOTICE & E_STRICT & ~E_WARNING & ~E_DEPRECATED); ini_set('display_errors',true); }
养成不用@的好习惯
$handle = @file('a.txt');
用FALSE表示错误,用NULL表示不存在
对于操作类的函数,失败返回FALSE,表示“操作失败了”,而对于查询的函数,如果找不到要的值,则应该返回NULL,表示“找不到”
代码实例:
public function getUserInfoByUid($uid){ try{ $this->db->exec('set names utf8'); $sql = "SELECT * from user"; $values[] = $uid; $ret = $this->db->fetch_all($sql,$values); if($ret){ return $ret[0]; //没有返回为NULL 有则返回数组 } } catch(Exception $e){ //写入错误日志 Log::warning(xxxx); // 重点在这 return false; } }
优先使用PHP内置函数
正则耗时,尽量避免,而采用直接的字符串处理函数代替,如邮箱:
filter_var('xiachengwei@163.com',FILTER_VALIDATE_EMAIL);
有用的PHP内置函数
parse_url - 解析URL,返回其组成部分
// 详情链接:http://www.php.net/parse_url $url = 'http://localhost/xmajiang/01trunk/index.php?g=Admin&m=Index&a=index'; var_dump(parse_url($url)); //执行结果:
http_build_query - 生成URL-encode 之后的请求字符串
// 详情链接:http://php.net/manual/zh/function.http-build-query.php
$data = array( 'foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); echo http_build_query($data) . "\n";
exif_imagetype - 判断一个图像的类型
//详情链接:http://php.net/manual/zh/function.exif-imagetype.php if (exif_imagetype("image.gif") != IMAGETYPE_GIF) { echo "这个图片不是gif图片"; }
uniqid - 生成一个唯一的ID
// http://php.net/manual/zh/function.uniqid.php printf("uniqid(): %s\r\n", uniqid());
//执行结果:
get_browser - 获取浏览器具有的功能
// 注意这里需要配置php.ini 详细文档:https://www.cnblogs.com/dee0912/p/5346991.html
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n"; var_dump(get_browser(null, true)); //执行结果:
不要相信外部的一切输入!所有的输入都要检查!
$username = htmlspecialchars($_GET['username']);
使用PDO操作MySql
# 写法一: $sql = "select * from chapter where id = :id"; // 预处理SQL语句 $res = $db->prepare($sql); // 执行 SQL if($res->execute([":id" => 1])){ // 获取一行结果集 $row = $res->fetch(); print_r($row); } # 写法二 $sql = "select * from chapter where id = ? and status = ?"; // 预处理SQL语句 $res = $db->prepare($sql); // 执行一条预处理语句 if($res->execute([2,1])){ // 获取一行结果集 $row = $res->fetch(); print_r($row); }
PHP的语法糖
计算机语言中添加的某种语法,这种语法对语言的功能并没有什么影响,但是更方便程序员使用。
常见的PHP语法糖
echo() , print() , die() , isset() , unset() , include() , include_once() , require() ,
require_once() , array() , list() , empty() , eval()
以上都不是函数,是语法糖。
echo 的逗号和点号
// 逗号优于点号 推荐使用 , $foo = 'hello'; $bar = 'world'; echo $foo . $bar; echo $foo , $bar;
判断字符串的长度
$str = 'hello'; if(strlen($str) === 5) echo 'do sth ...'; //优先使用 if(!isset($str[5])) echo 'do sth ...';
strlen() 函数执行起来相当快,值返回再 zval 结构中存储的已知字符串长度。但是由于strlen()是函数,多多少少会有些慢
使用 [ ] 代替 array( )
$arr = array(); $arr = []; $arr = array(1,2,3,4);
//此版本PHP大于5.3 $arr = [1,2.3,4];
用 ... 定义变长参数函数
//次特性需要PHP5.4以上 function addAll(...$num){ $sum = array_sum($num); return $sum; } addAll(1,2,3,4,5,6,7);
不用eval()
eval() 能够执行所有的PHP代码,非常的危险!慎用!
eval('echo `pwd`;');
PHP有个韩国人写的一个插件suhosin(韩国翻译:守护神)可以直接把语法糖中的eval等禁用掉 详情地址:
https://suhosin.org/stories/index.html
PHP 代码规范详情地址:https://github.com/PizzaLiu/PHP-FIG
PSR-0 目前已被弃用