首页后端开发PHP直击php反射学习之不用new方法实例化类操作

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

时间2024-02-02 08:12:03发布访客分类PHP浏览609
导读:收集整理的这篇文章主要介绍了直击php反射学习之不用new方法实例化类操作,觉得挺不错的,现在分享给大家,也给大家做个参考。本文实例讲述了php反射学习之不用new方法实例化类操作。分享给大家供大家参考,具体如下:上一篇php反射入门示例简...
收集整理的这篇文章主要介绍了直击php反射学习之不用new方法实例化类操作,觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

相关学习推荐:PHP编程从入门到精通

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

?phpclass 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

?phprequire 'student.php';
function make($class, $VARs = []) {
      $ref = new @R_777_50@($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 改一下

?phpclass 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

这时候运行一下

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

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

以上就是直击php反射学习之不用new方法实例化类操作的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 直击php反射学习之不用new方法实例化类操作
本文地址: https://pptw.com/jishu/596584.html
示例PHP购物车类Cart.class.php定义与用法 分享php生成不重复随机数、数组的4种方法

游客 回复需填写必要信息