这篇文章主要介绍了php反射学习之如何不用new方法实例化类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

首先创建一个文件 student.php:
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
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 改一下
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
这时候运行一下
1, 'name' => 'li']);
print_r($stu);
$stu->study();
$stu->showBag();
} catch (Exception $e) {
echo $e->getMessage();
}可以看到构造函数的第三个参数 $bag ,被自动实例化了,然后传递给了 Student 类的构造函数,这个部分很关键,这个地方可以用来实现依赖注入,我们不必在手动实例化对象了,我们可以根据参数的对应的类来自动实例化对象,从而实现类之间的解耦。如果你学过 Laravel的话,你应该对这个很熟悉了。
感谢你能够认真阅读完这篇文章,希望小编分享的“php反射学习之如何不用new方法实例化类”这篇文章对大家有帮助,同时也希望大家多多支持创新互联网站建设公司,,关注创新互联行业资讯频道,更多相关知识等着你来学习!
标题名称:php反射学习之如何不用new方法实例化类-创新互联
URL标题:http://www.jxjierui.cn/article/csodge.html


咨询
建站咨询
