PHP良好的代码习惯和技巧

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 目前已被弃用

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/xchengwei/p/9930293.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值