php反射类

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 就变成了索引数组了,而且要和自己配置项顺序一致,这应该是最不方便的一点了
	    	}

	     */
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值