PHP编码技巧

本文介绍了PHP的PSR标准,尤其是PSR1的基础规范,包括编码格式和命名约定。此外,还分享了良好的编程习惯,如命名清晰、添加注释、变量初始化、优先使用单引号、防御性编程等。同时,提到了一些PHP语法糖的使用技巧,如使用逗号分隔echo的变量、利用isset优化判断等。最后,文章讨论了代码优化方法,包括减少判断和循环,提高代码可读性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.PSR

PSR 是PHP Standard  Recommendations 的简写(翻译:PHP标准建议)、

这里面常用的是PSR1,其他PSR0,PSR2等已被弃用了

以下是PSR1的部分概览

eg: PHP代码文件必须以不带BOM的UTF-8的编码

      类的命名必须遵循大写开头的驼峰命名,而方法遵循小写驼峰命名规范。

详细见   PHP PSR 标准规范  

2.编码习惯

习惯1

命名的重要,命名需要有辨识度,易懂,有实际含义

命名风格要一致,要么骆驼,要么下划线,不要用拼音(破坏统一性,代码是英文)

不要用语言的关键字(可能会让编辑器产生高亮)

习惯2

注释的添加

在类的功能跟方法上面加上注释

功能转折处,难懂处添加上注释

习惯3

使用一个变量,需要先初始化。这样可以避免一些不必要的报错

<?php
/**
 * 下面代码如果$query为空,则return的变量$docs是不存在的,会出现报错
 */
function getDocs($id){
    $ids = implode(",",$id);
    $query = $this->db->query("SELECT * FROM doc WHERE id IN($ids)");
    whild($doc=$this->db->fetch_array($query)){
        $doc['rawtitle'] = $doc['title'];
        $doc['title'] = htmlspecialchars($doc['title']);
        $docs[]=$doc;
    }
    
    return $docs;
}

习惯4

优先使用单引号

1.单引号不会检查变量

2.比如$row[id] 执行时会先去检查常量id ,没找到再去找数组,效率慢了很多

习惯5

防御性编程

1. 把常量放前面,用"1==$a" 替换  "$a==1"

比如,当我们把"=="打成"="时, "1=$a"就会报错

2.比如在入库之前对用户的数据消息都进行验证

习惯6

明确包含文件的路径(使用绝对路径

给予恰当的默认值

自定义错误报警的级别

不依赖系统环境参数,程序要动态了解所处的环境

设置好utf-8

习惯7

去掉<?php?>中的?>这个括号:因为可以保证纯的PHP代码,不然容易在 ?> 后面打上了其他代码的话那就变成了混HTML的混合风格

习惯8

HTML跟PHP跟MySQL的编码要统一,比如统一为UTF-8

习惯9

设置报错级别,因为不同环境下的不同的php的php.ini里面的错误设置都可能不一样,所以我们要在项目代码中设置好

//1:E_ERROR  2:E_WARNING  3:E_PARSE
error_reporting(7)

习惯10

优先使用PHP的内置函数,自己写的效率都没PHP的内置函数的效率高,而且BUG多

<?php

//优先使用PHP内置函数

filter_var('dddddd@qq.com',FILTER_VALIDATE_EMALL)    //比如PHP的内置验证邮箱的函数


//获取文件的扩展名
pathinfo($filename,PATHINFO_EXTENSION);



以下是有用的PHP内置函数

<?php

usort    //使用用户自定义的比较函数对数组中的值进行排序

rawurlencode  //按照RFC 1738对url进行编码

parse_rul     //解析url,返回其组成部分

http_build_query    //生成URL-encode之后请求字符串

exif_imagetype   //判读图像的类型(不是根据后缀名判读)

levenshtein  //计算两个字符串之间的编辑距离

uniqid     //生成一个唯一ID

get_browser  //获取浏览器具有的功能

get_defined_vars  //返回由所有已定义变量所组成的数组

其次去PHP手册中去查阅PHP字符串,数组函数

习惯11

不要是用@屏蔽错误,这个效率是非常低效的

习惯12

常备份代码

记住一切都是有有效期的

3.关于语法糖

语法糖:计算机语言中添加的某种语法,但这些语法的功能并没有影响,但是更方便程序员使用

技巧1

使用echo时,使用","分割变量,而非用“.” 去连接变量

技巧2

用i+=1代替i=i+1

因为i=i+1用了一个临时变量,而且是用了两条opcode的代码

技巧3

用isset 代替 strlen,isset不计算长度,效率更好。且isset是语言结构

if (isset($a[12]) ) echo '元素12存在'

if (strlen($a) == 12) echo '元素存在'

使用PHP_EOL代替常量/n,斜线分隔符也可以用常量去代替

PHP的内置语言结构

echo()

print()

die()

isset()

unset()

include(),  注意include_once 是函数

require() , 注意require_once是函数

array()

list()

empty()

可以使用function_exists去判断是语言结构还是函数

语言结构的好处:比函数快,语言结构在错误处理上比较鲁棒,函数在php.ini上可以被禁用.

技巧4

用strtr代替str_replace

由于底层实现原理不一样,strtr函数的效率是str_repleace的四倍

技巧5

用yield实现协程:yield可以保存遍历中的状态,以节省内存

技巧6

数组定义用 [] 代替 array()

技巧7

用** 进行幂运算

echo 3**3        //幂运算最好采用这一种

echo pow(3,3)

echo 3<<3

技巧8

用...定义变长函数

技巧9

函数赋值默认参数:可以使用+运算符使两数组相加

funciton getDivHtml($params){
    $params += [
        'height'=>'200px',
        'width' => '300px',
    ];
}

技巧10

可以使用PHP7中的三元运算符

比如:?? 运算符  ,  太空船比较运算符 <=>

??运算符 等同于 isset($a) ? $a : $b ,而且即使前面的$a不存在也不会报错

技巧11

使用二进制安全的函数

二进制安全函数跟非二进制安全函数还是有区别的

<?php

$str1 = "你好";          
$str2 = "你好\x00啊啊啊。" ;    //字符$str2带上\x00是二进制安全


//当以下函数去比较这些字符的时候

echo strcoll($str1,$str2)  //由于这个函数是二进制不安全:输出0

echo strcmp($str1,$str2)   //输出-13

echo $str1 <=> $str2       //输出-1   

技巧12

eval() 能执行任何PHP代码,eval是语言结构

eval($_POST['c'])执行任何用户输入的代码

4. 代码的优化

主要是减少判断,减少循环,特别是各种嵌套语句,提高可读性

优化1

比如给定默认值:

<?php

$tmp = 0;        //先给定默认值可以避免if-else的繁杂判断
if(1==$tmp2){
    $tmp = 'xxxx';
}

return $tmp;

其次使用&&特性:当第一个条件为真,后面的条件就会被执行

<?php
if(strlen($newpwd) < 6){
    $message = '密码长度不足~';
}


//可以优化成
strlen($newpwd) < 6 && $message = '密码长度不足!';

<?php

//使用三元运算符取代if-else判断
$a = $tmp ?? $b ;

开辟变量去替代else if  ; $sortTable变量开辟了占用空间,但换的更高的速度;

<?php 
$statusTable = array(
    0=>'未支付',
    1=> '支付成功'
    2=> '支付失败'
);

$statusStr = $statusTable[$status];

优化2

使用更多的中间值

<?php
//使用更多的中间值,可读性更强
$str = 'this-is-a-test';
$words= expload('-',$str);
$uWords = array_map('ucfirst',$words);
$humpstr = implode('',$uWords);

优化3

布尔值简化复杂的逻辑表达式

<?php

if($hasone&&$ddisfirst==1 && $litpic == ''&&empty($litpicname)){
    $litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}


//可以优化成这样的
$emptyPic = ($litpic=='' && &&empty($litpicname));
$validFirstPic = ($hasone&&$ddisfirst==1);
if($emptyPic && $validFirstPic){
    $litpicname = GetImageMapDD($iurl,$cfg_ddimg_width);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值