首页 > 数码 正文

php反射机制与应用

时间:2023-11-08 作者:佚名

反射

面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。

反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对象,我们可以仅仅通过这个对象就能知道它所属的类、拥有哪些方法。

反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

如何使用反射API?

<?php

class person{

public $name;

public $gender;

public function say(){

echo $this->name,” \tis “,$this->gender,”\r\n”;

}

public function set($name, $value) {

echo “Setting $name to $value \r\n”;

$this->$name= $value;

}

public function get($name) {

if(!isset($this->$name)){

echo ‘未设置’;

$this->$name=”正在为你设置默认值”;

}

return $this->$name;

}

}

$student=new person();

$student->name=’Tom’;

$student->gender=’male’;

$student->age=24;

现在,要获取这个student对象的方法和属性列表该怎么做呢?如以下代码所示:

// 获取对象属性列表

$reflect = new ReflectionObject($student);

$props = $reflect->getProperties();

foreach ($props as $prop) {

print $prop->getName() .”\n”;

}

// 获取对象方法列表

$m=$reflect->getMethods();

foreach ($m as $prop) {

print $prop->getName() .”\n”;

}

也可以不用反射API,使用class函数,返回对象属性的关联数组以及更多的信息:

// 返回对象属性的关联数组

var_dump(get_object_vars($student));

// 类属性

var_dump(get_class_vars(get_class($student)));

// 返回由类的方法名组成的数组

var_dump(get_class_methods(get_class($student)));

假如这个对象是从其他页面传过来的,怎么知道它属于哪个类呢?一句代码就可以搞定:

// 获取对象属性列表所属的类

echo get_class($student);

反射API的功能显然更强大,甚至能还原这个类的原型,包括方法的访问权限等,如:

// 反射获取类的原型

$obj = new ReflectionClass(‘person’);

$className = $obj->getName();

$Methods = $Properties = array();

foreach($obj->getProperties() as $v)

{

    $Properties[$v->getName()] = $v;

}

foreach($obj->getMethods() as $v)

{

    $Methods[$v->getName()] = $v;

}

echo “class {$className}\n{\n”;

is_array($Properties)&&ksort($Properties);

foreach($Properties as $k => $v)

{

    echo “\t”;

echo $v->isPublic() ? ‘ public’ : ”,$v->isPrivate() ? ‘ private’ : ”,

$v->isProtected() ? ‘ protected’ : ”,

$v->isStatic() ? ‘ static’ : ”;

echo “\t{$k}\n”;

}

echo “\n”;

if(is_array($Methods)) ksort($Methods);

foreach($Methods as $k => $v)

{

    echo “\tfunction {$k}(){}\n”;

}

echo “}\n”;

输出如下:

class person

{

public gender

public name

function get(){}

function set(){}

function say(){}

}

不仅如此,PHP手册中关于反射API更是有几十个,可以说,反射完整地描述了一个类或者对象的原型。反射不仅可以用于类和对象,还可以用于函数、扩展模块、异常等。

反射有什么作用?

反射可以用于文档生成。因此可以用它对文件里的类进行扫描,逐个生成描述文档。

既然反射可以探知类的内部结构,那么是不是可以用它做hook实现插件功能呢?或者是做动态代理呢?

例如:

<?php

class mysql {

function connect($db) {

echo “连接到数据库${db[0]}\r\n”;

}

}

class sqlproxy {

private $target;

function construct($tar) {

$this->target[] = new $tar();

}

function call($name, $args) {

foreach ($this->target as $obj) {

$r = new ReflectionClass($obj);

if ($method = $r->getMethod($name)) {

if ($method->isPublic() && !$method->isAbstract()) {

echo “方法前拦截记录LOG\r\n”;

$method->invoke($obj, $args);

echo “方法后拦截\r\n”;

}

}

}

}

}

$obj = new sqlproxy(‘mysql’);

$obj->connect(‘member’);

在平常开发中,用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息。在MVC和插件开发中,使用反射很常见,但是反射的消耗也很大,在可以找到替代方案的情况下,就不要滥用。

很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点。

喜欢 (0)

本文信息为网友自行发布旨在分享与大家阅读学习,文中的观点和立场与本站无关,如对文中内容有异议请联系处理。

本文链接:https://www.paituo.cc/tech/1219018.html

  • 小编推荐

    小米路由器是什么

    本文讲述小米路由器是什么小米路由器有什么作用及功能,简介如下近日小米正式发布了小米路由器正式版,并于今天(4月25日)开启首轮抢购,笔者看到不少网友纷纷抢购,但多数朋友只是跟风,并比知道小米路由器是什么,有什么用,是否适...

    你知道QQ等级有什么实际作用或用途吗 怎么知道自己的qq等级

    你知道QQ等级有什么实际作用或用途吗,简介如下现在的社交媒体越来越发达,而且每个社交媒体都有它独特的特点以及功能。而其中最受大家欢迎的肯定是QQ。作为中国最早的即时通信软件之一,QQ粘住了大量的用户。同时,...

    一方混凝土重量为多少吨 一方混凝土的重量是多少吨

    一方混凝土重量为多少吨,简介如下混凝土是一种常见的建筑材料,用于制作楼板、基础、墙面等。在建筑工程中,我们经常会听到“混凝土一方多少吨”的说法。那么,混凝土一方究竟有多少吨呢?这是一个非常重要...

    如何使用3D命令大全快速学习实用的3D命令技巧 如何使用命令方

    如何使用3D命令大全快速学习实用的3D命令技巧,简介如下在进行三维建模的时候,我们会使用各式各样的3D命令来实现我们的想法。所以,熟悉和掌握各种3D命令是做好三维建模的必要条件。本文将为大家介绍一些常用的3D命令大全...

    在表格中如何进行换行 在表格中如何进行求和

    在表格中如何进行换行,简介如下表格是一种常用的数据展示方式,但是有时候表格内的内容会很长,导致出现了无法放下的情况。这时候就需要考虑如何进行换行,以便让数据更加清晰地展示出来。下面我们来讨论...

    ThinkBook是什么 thinkbook和联想的区别

    ThinkBook是什么,简介如下ThinkBook是联想公司推出的一款适合年轻人使用的笔记本电脑。其外观时尚,性能强劲,拥有出色的续航能力,非常适合年轻人在学习、工作、娱乐等方面使用。在本文中...

    曝光量具体指什么 平台曝光量什么意思

    曝光量具体指什么,简介如下曝光量是指在特定时间段内,该媒体平台上展示给用户的某一条广告的总次数。曝光量是表示广告的曝光程度的一种方式,也是衡量广告推广效果的一个重要指标。另外一个常见的指...

    有没有免费的软件可以恢复照片 有没有免费的软件能下载微信

    有没有免费的软件可以恢复照片,简介如下恢复照片的免费软件是当今数字时代的必备工具之一。随着人们越来越多地用电脑、手机等设备来保存重要的信息和照片,意外删除、格式化、病毒攻击等情况发生的频率也在增加。...