php反射类
PHP5以及之后具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。
一般用在框架中,需要实例化一些基础类,有的实例化需要参数,有的不需要,并且参数个数不定,使用反射类可以很好的
兼容这些。
PHP的反射类ReflectionClass、ReflectionMethod
反射是什么?
一、通过ReflectionClass,我们可以得到Person类的以下信息:
1.常量 Contants
2.属性 Property Names
3.方法 Method Names静态
4.属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract
7.Person类是否有某个方法
也就是说,一旦这个类被反射了,那么我么就可以获取关于这个类的所有信息,一般在框架中用的很多。
接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:
代码如下:
$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类
$instance = $class->newInstanceArgs($args); // 相当于实例化Person类,
注意,$args为强制数组,并且,即使你传的是关联数组,到了Person类的构造函数中,参数按顺序排列的单个参数。
public ReflectionClass::newInstanceArgs ([ array $args ] ) : object
以下是easyswoole框架源码:实例化MysqliDb类
public static function mainServerCreate(ServerManager $server,EventRegister $register): void
{
Di::getInstance()->set('MYSQL',\MysqliDb::class, \Yaconf::get('database'));
// \MysqliDb::class => 带命名空间的类名字符串
// \Yaconf::get('database') => 数据库配置,数组
}
Di类代码
class Di
{
use Singleton;
private $container = array();
public function set($key, $obj, ...$arg):void
{
if(count($arg) == 1 && is_array($arg[0])){
$arg = $arg[0];
}
/*
* 注入的时候不做任何的类型检测与转换
* 由于编程人员为问题,该注入资源并不一定会被用到
*/
$this->container[$key] = array(
"obj"=>$obj,
"params"=>$arg,
);
}
function delete($key):void
{
unset( $this->container[$key]);
}
function clear():void
{
$this->container = array();
}
function get($key)
{
if(isset($this->container[$key])){
$result = $this->container[$key];
if(is_object($result['obj'])){
return $result['obj'];
}else if(is_callable($result['obj'])){
return $this->container[$key]['obj'];
}else if(is_string($result['obj']) && class_exists($result['obj'])){
$reflection = new \ReflectionClass ( $result['obj'] );
$ins = $reflection->newInstanceArgs ( $result['params'] );// 传入的是关联数组
$this->container[$key]['obj'] = $ins;
return $this->container[$key]['obj'];
}else{
return $result['obj'];
}
}else{
return null;
}
}
}
MysqliDb类
class MysqliDb
{
function __construct($host = null, $username = null, $password = null, $db = null, $port = null, $charset = 'utf8', $socket = null)
{
...
}
/*
或者
function __construct(...$args){
// 实际 $args 就变成了索引数组了,而且要和自己配置项顺序一致,这应该是最不方便的一点了
}
*/
}
php反射类
最新推荐文章于 2023-06-16 17:59:19 发布