php新特性
概念
-
命名空间
- 按照一种虚拟的层次结构组织PHP代码,目的旨在解决命名冲突
- 为PHP-FIG制定PSR-4自动加载标准奠定了坚实的基础
-
Trait
- 作用:表明类可以做什么;提供模块化实现
- 应用场景:让无关的php类具有类似的行为,使用时用use关键字在类的定义体内导入
- Trait 是类的部分实现,可以混入一个或多个现有的PHP类中,为单继承提供代码复用机制
-
闭包/匿名函数
- 闭包指在创建时封装周围状态的函数
- 目的:即便闭包所在的环境不存在了,闭包中封装的状态依然存在
- 匿名函数可以赋值给变量,闭包通常没有函数名
- 在php中必须手动调用闭包对象的bindTo方法或使用use关键字把父作用域的变量及状态附加到PHP闭包中
-
闭包对象的bindTo方法
- 闭包是一个对象,可以在闭包中使用
$this
关键字获取闭包的内部状态(默认状态无用) - 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用
- 通过bindTo方法可以把闭包的内部状态绑定到其他对象上,如此闭包可以访问被绑定对象的私有成员变量
- 应用场景
- 使用bindTo方法把路由URL映射到匿名回调函数上
- 框架会把匿名回调函数绑定到应用对象上
- 如此这般,在匿名函数中就可以使用
$this
关键字引用重要的应用对象 - 目的在回调函数中处理App实例状态,相当于让回调中动态成为了应用实例的一个方法
$app = new App(); $app->addRoute(‘user/nonfu’, function(){ $this->responseContentType = ‘application/json;charset=utf8’; $this->responseBody = ‘{“name”:”LaravelAcademy"}'; }); $app->dispatch(‘user/nonfu'); class App { ... // 将回调路由绑定到了当前App的实例上 public function addRoute($routePath, $routeCallback) { $this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__); } }
- 闭包是一个对象,可以在闭包中使用
组件
- 定义
- 组件是一组打包的代码,是一系列相关的类、接口和Trait
- 语言之争,用正确的语言做正确的事
- 使用组件
- Packagist网站收集php组件,查找php组件社区
- Composer是PHP的依赖管理器,运行在命令行
- Composer有效抽象依赖管理和自动加载
- 示例项目
- 扫描一个CSV文件中的URL,找出死链
guzzlehttp/guzzle
处理http消息league/csv
处理CSV数据- 流程
- 引入composer自动加载器,编码
- 执行
php scan.php urls.csv
代码
require 'vendor/autoload.php';
//实例Guzzle Http客户端
$client = new GuzzleHttp\Client();
//打开并迭代处理CSV
$csv = League\Csv\Reader::createFromPath($argv[1]);
foreach ($csv as $csvRow) {
try {
//发送HTTP GET请求
$httpResponse = $client->get($csvRow[0]);
//检查HTTP响应的状态码
if($httpResponse->getStatusCode() >= 400) {
throw new Exception();
}
} catch (Exception $e) {
//把死链发给标准输出
echo $csvRow[0] . PHP_EOL;
}
}