• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    php反射学习之不用new方法实例化类操作示例

    本文实例讲述了php反射学习之不用new方法实例化类操作。分享给大家供大家参考,具体如下:

    上一篇php反射入门示例简单介绍了 php 反射的几个常见类的使用方法,但是用反射能做些什么,你可能还是想象不到,

    下面我稍微应用反射类来做点东西,大家知道实例化一个类需要用new 关键字,不用 new 可以吗?答案是可以的,用反射就能实现:

    首先创建一个文件 student.php:

    ?php
    class Student
    {
      public $id;
      public $name;
      public function __construct($id,$name)
      {
        $this->id = $id;
        $this->name = $name;
      }
      public function study()
      {
        echo $this->name.' is learning.....'.PHP_EOL;
      }
      public function showBag(){
        echo "My bag have ".$this->bag->all();
      }
    }
    
    

    另新建一个文件run.php

    ?php
    require 'student.php';
    function make($class, $vars = []) {
      $ref = new ReflectionClass($class);
      if(!$ref->isInstantiable()) {
        throw new Exception("类{$class} 不存在");
      }
      $constructor = $ref->getConstructor();
      if(is_null($constructor)) {
        return new $class;
      }
      $params = $constructor->getParameters();
      $resolveParams = [];
      foreach ($params as $key=>$value) {
        $name = $value->getName();
        if(isset($vars[$name])) {
          $resolveParams[] = $vars[$name];
        } else {
          $default = $value->isDefaultValueAvailable() ? $value->getDefaultValue() : null;
          if(is_null($default)) {
            if($value->getClass()) {
              $resolveParams[] = make($value->getClass()->getName(), $vars);
            } else {
              throw new Exception("{$name} 没有传值且没有默认值。");
            }
          } else {
            $resolveParams[] = $default;
          }
        }
      }
      return $ref->newInstanceArgs($resolveParams);
    }
    
    

    run.php 中make 函数就是我们用来实例化类而编写的函数,第一个参数传入类名,第二个参数是类的构造函数需要传入的参数数据。

    根据 Student 的构造函数的参数不同有几种情况:(以下代码,请按不同情况追加到 run.php 中运行)

    情况一: 没有提供 $name 的值

    try {
      $stu = make('Student', ['id' => 1]);
      print_r($stu);
      $stu->study();
    } catch (Exception $e) {
      echo $e->getMessage();
    }
    
    

    在构造函数中$name 没有默认值时,情况一会报错, 你可以稍微修改下 Student类,给 $name 提供一个默认值,这时候就不会报错了。

    情况二 提供了 $name 的值

    try {
      $stu = make('Student', ['id' => 1, 'name' => 'li']);
      print_r($stu);
      $stu->study();
    } catch (Exception $e) {
      echo $e->getMessage();
    }
    
    

    情况三,我们把 student.php 改一下

    ?php
    class Bag{
      public function name(){
        return "学生包".PHP_EOL;
      }
    }
    class Student
    {
      public $id;
      public $name;
      public function __construct($id, $name="xxx", Bag $bag)
      {
        $this->id = $id;
        $this->name = $name;
        $this->bag = $bag;
      }
      public function study()
      {
        echo $this->name.' is learning.....'.PHP_EOL;
      }
      public function showBag(){
        echo "My bag is ".$this->bag->name();
      }
    }
    
    

    可以看到,给 Student 类加了一个参数$bag, 类型 是 Bag

    这时候运行一下

    ?php
    try {
      $stu = make('Student', ['id' => 1, 'name' => 'li']);
      print_r($stu);
      $stu->study();
      $stu->showBag();
    } catch (Exception $e) {
      echo $e->getMessage();
    }
    
    

    可以看到构造函数的第三个参数 $bag ,被自动实例化了,然后传递给了 Student 类的构造函数,这个部分很关键,这个地方可以用来实现依赖注入,我们不必在手动实例化对象了,我们可以根据参数的对应的类来自动实例化对象,从而实现类之间的解耦。如果你学过 Laravel的话,你应该对这个很熟悉了。

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP的反射动态获取类方法、属性、参数操作示例
    • php面试实现反射注入的详细方法
    • PHP反射原理与用法深入分析
    • php提供实现反射的方法和实例代码
    • PHP进阶学习之反射基本概念与用法分析
    • PHP反射学习入门示例
    • PHP反射实际应用示例
    • 用PHP的反射实现委托模式的讲解
    • 浅析PHP类的反射来实现依赖注入过程
    • PHP基于反射机制实现自动依赖注入的方法详解
    • PHP基于反射获取一个类中所有的方法
    • PHP反射基础知识回顾
    上一篇:PHP反射学习入门示例
    下一篇:php反射学习之依赖注入示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    php反射学习之不用new方法实例化类操作示例 php,反射,学,习之,不用,new,