跟着辛星深入探讨一下PHP的反射机制

      早在之前学习Java的时候,清楚的记得是学完了多线程之后学习的反射,现在在PHP中当然也有反射机制,如果童鞋你还不明白,那就需要搞明白奥,毕竟反射的功能还是蛮强大的,学习它还是很具有现实意义的。 反射从简单去理解就是我们拿到一个类,得到这个类的一些信息,比如它有哪些方法、有哪些参数等等,当然我们还可以动态的去调用它的方法等等一些功能,它的用途就是可以自动加载插件、自动生成文档等等,从而达到扩展PHP语言的作用。

        几乎所有的反射类都实现了reflector接口,所有的实现类都拥有一个方法,那就是export方法,我们可以用该方法来查看一些信息,这里我们以PHP的内置类作为第一个例子来看一下反射的基本用法,我们新建一个php文件,代码如下:

<?php
$class = new ReflectionClass("mysqli");
Reflection::export($class);

      下面是它的本部分输出信息:

Class [ class mysqli ] { - Constants [0] { } - Static properties [0] { } - Static methods [1] { Method [ static public method poll ] { - Parameters [5] { Parameter #0 [ array or NULL &$read ] Parameter #1 [ array or NULL &$write ] Parameter #2 [ array or NULL &$error ] Parameter #3 [ $sec ] Parameter #4 [ $usec ] } } } - Properties [19] { Property [ public $affected_rows ] Property [ public $client_info ] Property [ public $client_version ] Property [ public $connect_errno ] Property [ public $connect_error ] Property [ public $errno ] Property [ public $error ] Property [ public $error_list ] Property [ public $field_count ] Property [ public $host_info ] Property [ public $info ] Property [ public $insert_id ] 

      这里我只是截取了部分内容,因为全部内容还是挺长的,我们可以看出它没有定义任何的静态属性,它有一个静态方法,方法名是poll,它需要五个参数,这五个参数的第一个可以是一个数组,也可以是一个NULL,它是变量$read代表的,第二个参数是一个数组或者一个NULL等等。。。。这里不一一列举了,读者可以阅读上面的代码段自行判断。

       下面说一下我们的代码做了什么工作,我们首先定义了一个反射类ReflectionClass的实例$class,我们可以用var_dump来查看它的信息,这里我就不粘贴信息了,就看读者是否亲自操作了,然后我们调用Reflection的静态方法export来导出这个类的信息,然后我们就看到了上面的信息。

       上面我们用反射机制来查看了该内置类的一些信息,那么对于我们自定义的类,我们能否查看呢,答案显然是可以的,比如如下代码:

<?php
class Person{
	public $name;
	/**
	*仅仅用来打印信息
	*/
	public function test(){
		echo "辛星加油";
	}
}

foreach(get_declared_classes() as $class){
	$myclass = new ReflectionClass($class);
	if($myclass->isUserDefined()){
		Reflection::export($myclass);
	}
}
       然后我们运行上述代码,发现输出信息如下:

Class [ class Person ] { @@ D:\MyApp\wamp\www\ap.php 2-10 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [1] { Property [ public $name ] } - Methods [1] { /** *仅仅用来打印信息 */ Method [ public method test ] { @@ D:\MyApp\wamp\www\ap.php 7 - 9 } } }
      通过它的反射机制,我们看到的还是蛮全面的,比如它没有定义常量,也没有静态属性,有一个公开的属性,是$name,还有一个方法,叫做test,而且该方法的注释是"/** * 仅仅用来打印信息 */",这里大家能否进一步了解到写一个好的注释的作用呢,这样别人反射你的类的时候,就能看到这个函数的作用了。顺便提一下,这里的get_declared_classes用于获取已定义的类,而需要注意的是上面的$myclass是一个类,不是一个字符串,因此它有自己的方法来检测isUserDefined是否是用户调用的。

     可能有些童鞋会说,我们通过var_dump也可以获取类的一些信息啊,没错,还是同一个类,我们看看用var_dump会输出什么,代码如下:

<?php
class Person{
	public $name;
	/**
	*仅仅用来打印信息
	*/
	public function test(){
		echo "辛星加油";
	}
}

$person = new Person();
$person->name = "xinxing";
var_dump($person);

它的输出如下:

object(Person)[1]
  public ‘name‘ => string ‘xinxing‘ (length=7)

     当然,可能大家也都知道var_dump和反射相比,对于类的操作还是很弱的,它只能够查看类的实例的信息,而且只能看类的属性,对于类里面的注释和方法都无能为力,没办法,这不是对象应该有的。

      不要走开,我的博客会继续写一篇关于反射的应用的,这是这个篇幅有点长了,我想另开一篇博客 而已,期待您的关注。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。