php 新特性不完全攻略

php新特性

概念

  1. 命名空间

    • 按照一种虚拟的层次结构组织PHP代码,目的旨在解决命名冲突
    • 为PHP-FIG制定PSR-4自动加载标准奠定了坚实的基础
  2. Trait

    • 作用:表明类可以做什么;提供模块化实现
    • 应用场景:让无关的php类具有类似的行为,使用时用use关键字在类的定义体内导入
    • Trait 是类的部分实现,可以混入一个或多个现有的PHP类中,为单继承提供代码复用机制
  3. 闭包/匿名函数

    • 闭包指在创建时封装周围状态的函数
    • 目的:即便闭包所在的环境不存在了,闭包中封装的状态依然存在
    • 匿名函数可以赋值给变量,闭包通常没有函数名
    • 在php中必须手动调用闭包对象的bindTo方法或使用use关键字把父作用域的变量及状态附加到PHP闭包中
  4. 闭包对象的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__);
              }
          }
      

组件

  1. 定义
    • 组件是一组打包的代码,是一系列相关的类、接口和Trait
    • 语言之争,用正确的语言做正确的事
  2. 使用组件
    • Packagist网站收集php组件,查找php组件社区
    • Composer是PHP的依赖管理器,运行在命令行
    • Composer有效抽象依赖管理和自动加载
  3. 示例项目
    • 扫描一个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;
          }
      }

猜你喜欢

转载自blog.csdn.net/u011584949/article/details/84304878