跟着辛星深入探讨一下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和反射相比,对于类的操作还是很弱的,它只能够查看类的实例的信息,而且只能看类的属性,对于类里面的注释和方法都无能为力,没办法,这不是对象应该有的。

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

时间: 2024-10-12 13:53:59

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

跟着辛星一起用CSS美化商品列表

说实话,最近对CSS的关注还是蛮多的,不为别的,只是因为自己喜欢,感觉写CSS就像画家绘画一样,使用热情和激情去探索,没有了那份功利心,反而感觉是一种享受,特别有成就感,好啦,今天就分享一期自己用CSS美化商品列表的步骤把,不喜勿喷奥,有建议请留言. 首先看一下做好之后的效果图把: 如果读者特别不喜欢这个样式,可以点击右上角的关闭,省的自己看了心烦意乱,好,我们首先新建一个HTML文件,内容书写如下: <html> <head> <title>CSS新闻列表制作<

跟着辛星认识一下PHP的自己主动载入

作为一个框架,文件的载入机制是不能少的,那么我们应该怎么载入呢,这些PHP已经给我们想好了,所以我们仅仅须要依照规则办事就能够了,PHP中有两个函数能够完毕这个功能,第一个是__autoload,如今已经非常少用了,取而代之的是功能更加强大的spl_autoload_register,它须要的版本号是PHP5.2.1之后的版本号,如今我们的主流版本号都是支持的,因此能够放心使用. 在曾经的PHP版本号中,我们往往须要require一堆的文件名称,比方配置文件.数据库连接文件.日志文件等等,后来我

跟着辛星用PHP的反射机制来实现插件

我的博文的前一篇讲解了PHP的反射机制是怎么回事,如果读者还不清楚反射机制,可以搜索下或者看我的博文,都是不错的选择,我们开始讲解一下怎么用PHP来实现插件机制.所谓插件机制,就是我们定义一个接口,即我们定义一个interface,然后第三方插件就去实现这个interface,然后我们拿到了这个插件之后,去调用这个插件的功能,我们可以不知道这些插件的类名等信息,我们接下来就用反射机制去实现这个功能. 由于我只是简单的示例,所以我写的代码并不长,而且很简单,所以,大家既然理解了上面的步骤,那么就可

跟着辛星解读PHP中json的使用

由于json是那么的重要,因此PHP自从5.2就增加了对JSON的支持,主要包括两个函数:json_encode和json_decode.众所周知,json是一种数据的存储格式,我的博文里写过json的,在我的Javascript教程中,不明白的读者可以去搜一下. 比如我们新建一个xin.json文件,存储数据如下: [{"name":"辛星","age":23},{"name":"小倩","ag

跟着辛星认识一下PHP的自动加载

作为一个框架,文件的加载机制是不能少的,那么我们应该怎么加载呢,这些PHP已经给我们想好了,所以我们只需要按照规则办事就可以了,PHP中有两个函数可以完成这个功能,第一个是__autoload,现在已经很少用了,取而代之的是功能更加强大的spl_autoload_register,它需要的版本是PHP5.2.1之后的版本,现在我们的主流版本都是支持的,因此可以放心使用. 在以前的PHP版本中,我们往往需要require一堆的文件名,比如配置文件.数据库连接文件.日志文件等等,后来我们有了__au

跟着辛星一起了解下PHP的函数的性能

首先声明一下,这篇文章是我的原创,但是,这些数据不是我总结出来的,大家可以搜索下"百度工程师HDK",这些数据是他提供的,我只是给一个总结,因为他那篇文章很长,我这里提炼了几点要点. 要了解函数的性能,首先要知道函数的执行流程,它首先通过scanning被转化为语言片段(tokens),然后通过parsing为简单有意义的表达式,然后compile(编译)为Opcode,最后execute(执行).因为PHP本身是用C去实现的,因此最终调用的都是C的函数,即PHP就是一个用C开发出来的

辛星跟您玩转vim第一节之vim的下载与三种模式

首先值得一提的是,我的vim教程pdf版本已经写完了,大家可以去下载,这里是csdn的下载地址:点此下载 ,如果左边的下载地址挂掉了,也可以自行在浏览器下面输入如下地址进行下载:http://download.csdn.net/detail/xinguimeng/7714213 ,当然,如果你是百度网盘的忠实用户,也可以借助于百度网盘,我也同步上传到百度网盘了,下载地址如下:百度网盘下载 ,如果地址挂了,可以在浏览器中输入:http://pan.baidu.com/s/1sj9CLXz 来下载.

辛星网站构架师笔记第三篇

下面大家跟着辛星来认识一下Nginx把,它是一个跨平台的服务器,但是它和传统的服务器不同的是,它不依赖于线程处理请求,它有自己的扩展性更强的驱动(异步)架构,因此它更加适合在高流量的网站.而且它还可以作为一个负载均衡器,它可以在内部直接支持Rails和PHP程序的,而且它也可以作为一个HTTP代理服务器对外进行服务.Nginx使用C语言写成. 我们上一节介绍了LVS,那么两者的区别是什么呢?第一点就是因为lvs的工作方式简单,它只是负责请求的分发,而且工作在网络的第四层,因此其负载能力强,不会产

辛星解读mysql中的MyISAM引擎

很多以前的教科书上都是写的MyISAM是mysql的默认存储引擎,其实自从mysql5.5开始,默认存储引擎就已经改变成为InnoDB了,由于InnoDB在很多方面有着不可替代的功能,因此,很多人喜欢研究InnoDB也在情理之中,我也很喜欢InnoDB.但是呢,对于MyISAM,就跟着辛星辛博士来认识一下吧. 第一点就是MyISAM不支持事务和外键,也正是基于这一点,很多人不喜欢MyISAM.但是MyISAM并不着急改变自己,因为这个引擎的重心是性能,而不是功能,不可否认,MyISAM的性能是非