读《Modern PHP》笔记

读这本书感觉真的是一个前辈给后辈的敦敦教诲,颇费苦心。

我在这里列一下这本书的精华,供大家参考。

使用接口

依赖接口,而非具体实现,可以解耦,参考Laravel的契约

性状(trait)

这个特性很有意思,名字名副其实。 假如现在有一个人,还有一辆车,车和人都要实现给自己定位的功能,显然车和人不适合从一个父类继承,那这个时候trait就排上用场了。这是一个横向复用机制,让若干不想关的类带上同样一个性状。 http://php.net/manual/zh/language.oop5.traits.php

生成器(yield)

这个特性也很有用,yield和return类似,区别在于yield只产出值,不返回值。
也可以这样理解,return是一次性全部交付给你,yield是承诺全部交付给你,但这次先把你现在用到的东西给你,剩下的下次你再来取。
显然,在迭代一个超大数据的时候(遍历超大数组),yield可以先给你一个元素,不用生成整个数组,可以省内存。

上代码:

<?php
function makeRange($length){

    $arr=[];

    for($i=0;$i<$length;$i++) $arr[]=$i;

    return $arr;

}

$results=makeRange(100000);

foreach($results as $i) echo $i.PHP_EOL;  

代码2:

<?php

function makeRange($length){

    $arr=[];

    for($i=0;$i<$length;$i++) yield $i;

}

foreach(makeRange(100000) as $i) echo $i.PHP_EOL;

第一个是先生成一整个数组再遍历,第二个是一边生成一边遍历。 http://php.net/manual/zh/language.generators.overview.php

闭包,命名空间,opcache

PSR,组件,composer

这三个东西对现代PHP意义特别重大,选择可复用组件就是选择了未来,细分领域让最专业的人去做。

过滤,验证,转义(防注入和防XSS)

输入和输出要过滤html,使用htmlentities($str, ENT_QUOTES, "UTF-8"); 第二个参数开启转义单双引号,第三个参数指明字符集,都是必须开启的。

使用PHP自带过滤和验证函数
filter_input() http://php.net/manual/zh/function.filter-input.php

filter_var() http://php.net/manual/zh/function.filter-var.php

数据库

使用PDO和预处理

密码

使用内置的密码函数,使用bcrypt加密

password_hash() http://php.net/manual/zh/function.password-hash.php

password_verify() http://php.net/manual/zh/function.password-verify.php

多字节字符串

使用mb系列函数

流处理,错误和异常,自动部署,持续测试