php 编程基础

基于PHP7 理解PHP的函数以及代码规范,增加代码可读性,和效率。尽量使用PHP内置的函数,因为PHP本身不是很善于处理数据,因为他是解释型语言。如果PHP本身函数满足不了业务需求,并且是个常用功能,自己写个扩展也是个好的做法。

语法和基础编程规则可以参考:
php权威编程
PHP的书写规范 PSR1-4

1.传值传引用

这并不是什么高大上的技巧,这是一个不需要使用的,有很多人鼓吹这是多么的高效,但是缺点很多,不利于逻辑完整,增加了代码的可读性,对后面的代码优化和迭代都会增加成本。这是个PHP4时代的函数,但是PHP4已死。

2.正则匹配

正则匹配效率浪费很大,使用需谨慎。

3.多层循环

请不要在你的项目中进行多层循环,因为数量一大,很容易卡死,能用foreach 不要用for循环,
当你必须要用多层循环时,请格式化代码,在foreach里面判断,效果要比两层foreach好很多

$couponData = array([id=>1,staff=>22],[id=>2,staff=>223],[id=>2,staff=>224]);
$formatCouponData=[];
foreach ($couponData as $m ){
  $formatCouponData[$m['Id']] = $m;
}

写到这是不是明白什么意思了,把需要判断的数据放到key里面,然后对比数据的时候,直接判断就可以了
这样的好处在数据量小的时候看不出优势,但是当数据量大的时候,两层foreach会教你做人的。

4.关于静态化的理解

有利于效率,但是不要多用哦

5.不要用@掩饰错误

@会在你代码所在行,前后执行内容前后添加代码,用来忽略报错,结果显而易见,浪费效率。

6.在循环里别用函数

例如For(x < count(x), count())函数在外面先计算;原因是每次循环结束都会重新计算count(x),很好理解。

7.用单引号代替双引号来包含字符串

原因是PHP会在双引号包围的字符串中搜寻变量,单引号则不会。

8.三元运算符

如果逻辑很短的话为什么不尝试一下三元运算符呢,效率相差不大,但是既增加了代码简洁性,又增加了可读性,何乐而不为呢。

9.容易混淆的isset,empty,is_null

isset 判断变量是否设置,return为 true 和 false
其实还可以这样写:

$a= NULL;
$b= 1;
$infoA = $a ?? 2;  //2
$infoB = $a ?? 2;  // 1
$var = '';
isset($var) //true
$var2 = NULL;
isset($var2) //false
//同时可以判断多个变量
isset($var,$var2)//false
//对于数组元素同样有效
$a = array ('test' => 0,'test1' => '', 'hello' => NULL, 'pie' => array('a' => 'apple'));
isset($a['hello']) //false
isset($a['test']) //true
isset($a['test1']) //true

注意!
isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
empty — 检查一个变量是否为空
当变量存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE.
以下的东西被认为是空的:返回true
"" (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
"0" (作为字符串的0)
NULL
FALSE
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)
相对来说is_null好理解一点,
is_null — 检测变量是否为 NULL

10.使用选择分支语句优先于if

switch case好于使用多个if,else if语句,并且代码更加容易阅读和维护。

11.数据库连接

当使用完毕时应关掉,不要用长连接。一般如果基于框架开发的话,不必考虑这个问题,当你自己写数据库封装的时候尤其要注意。

12.线上调试

当项目调试陷入困境,bug无法再线下还原但是线上一直有这个问题的时候,我们只能进行线上的调试,这个时候要打印日志,然后读取日志进行调试

13.逻辑顺序

数据库权限一定要分清。
先接受前端传过来的值,值一定要前后端都要验证,
后端对值进行验证时一定要遵循几个原则,一旦不符合直接抛出
状态值:例如只用来判断是否,对错,直接判断数值 $status == 1 || $status == 0,判断前需要注意格式。
数值类型的订单号等:一般都有固定格式,先判断长度,如果还有其他逻辑在判断。
字符串类:这些类型一定要注意,这些值一般是表单值,关键字,特殊符号过滤,去空格。
验证后再进行逻辑。

14 应该尽量避免使用的:

__get,__set,__autoload require_once()
include 文件时尽量使用绝对路径,因为它避免了 PHP 去 include_path 里查找文件的速度,解析操作系统路径所需的时间会更少

15 优化

  1. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套 PHP 缓存机制通常 可以提升 25%至 100%的性能,以免除编译开销。
  2. 预定义变量

递增一个全局变量要比递增一个局部变量慢
递增一个未预定义的局部变量要比递增一个预定义的局部变量慢,

  1. 当操作字符串并需要检验其长度是否满足某种要求时, 你想当然地会使用 strlen()函数。 此函数执行起来相当快,因为它不做任何计算,只返回在 zval 结构(C 的内置数据结构,用 于存储 PHP 变量)中存储的已知字符串长度。但是,由于 strlen()是函数,多多少少会有些 慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP 不区分函 数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用 isset() 技巧加速执行你的代码。 (举例如下) if (strlen($foo) < 5) { echo “Foo is too short”$$ } (与下面的技巧做比较) if (!isset($foo{5})) { echo “Foo is too short”$$ } 调用 isset()恰巧比 strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它 的执行不需要函数查找和字母小写化。 也就是说, 实际上在检验字符串长度的顶层代码中你 没有花太多开销。

4.当执行变量$i 的递增或递减时,$i++会比++$i 慢一些。这种差异是 PHP 特有的,并不 适用于其他语言, 所以请不要修改你的 C 或 Java 代码并指望它们能立即变快, 没用的。 ++$i 更快是因为它只需要 3 条指令(opcodes),$i++则需要 4 条指令。后置递增实际上会产生一 个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的 一种,正如 Zend 的 PHP 优化器所作的那样。牢记这个优化处理不失为一个好主意,因为 并不是所有的指令优化器都会做同样的优化处理, 并且存在大量没有装配指令优化器的互联 网服务提供商(ISPs)和服务器。

  1. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

6.尽量采用大量的 PHP 内置函数。
7.当你需要时,你总能把代码分解成方法。
8.如果在代码中存在大量耗时的函数,你可以考虑用 C 扩展的方式实现它们。
9.评估检验(profile)你的代码。 检验器会告诉你, 代码的哪些部分消耗了多少时间。 Xdebug 调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
10.尽量的少进行文件操作,虽然 PHP 的文件操作效率也不低的;
待续....

江兆辉博客
请先登录后发表评论
  • 最新评论
  • 总共1条评论
江兆辉博客

江兆辉江兆辉博客

2018-08-14 14:14:22 回复