php 的反射详解及示例代码

作者:掸尘 时间:2024-06-05 09:46:28 

最近在看java编程思想,看到类型信息这一章,讲到了类的信息以及反射的概念。顺便温故一下php的反射东西。手册是这样说的:"PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。"当然手册上说的有些抽象!所谓的逆向说白就是能获取关于类、方法、属性、参数等的详细信息,包括注释! 文字总是那么枯燥,举个例子


class Foo {
 public  $foo = 1;
 protected $bar = 2;
 private  $baz = 3;

/**
  * Enter description here ...
  */
 public function myMethod()
 {
   echo 'hello 2b';
 }
}

$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
 echo $value->getName()."\n";
}

//output
//foo
//bar
//baz

ReflectionClass 这个类返回时某个类的相关的信息,比如 属性,方法,命名空间,实现那些接口等!上个例子中ReflectionClass:: getProperties 返回是 ReflectionProperty 对象的数组。

ReflectionProperty 类报告了类的属性的相关信息。比如  isDefault isPrivate  isProtected isPublic isStatic等,方法getName 是获取属性的名称!

以上是获取属性的,还有获取类方法的比如


class Foo {
 public  $foo = 1;
 protected $bar = 2;
 private  $baz = 3;

/**
  * Enter description here ...
  */
 public function myMethod()
 {
   echo 'hello 2b';
 }
}

$ref = new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod 是反是一个 ReflectionMethod 类型 ,ReflectionMethod 类报告了一个方法的有关信息,比如 isAbstract isPrivate  isProtected isPublic isStatic   isConstructor,还有一个重要的方法Invoke,InvokeArgs 就是执行方法!

其他的对象可以看看手册,不是很难!

那反射究竟有哪些用途?

反射是一个动态运行的概念,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。还可构建模式,比如 * 。在一些php框架中使用反射也是很经常,比如kohana,yii,下面是kohana 的实现mvc的代码,就是用到了反射!


// Start validation of the controller
$class = new ReflectionClass(ucfirst(Router::$controller).'_Controller');
// Create a new controller instance
$controller = $class->newInstance();
// Load the controller method
$method = $class->getMethod(Router::$method);
// Execute the controller method
$method->invokeArgs($controller, $arguments);

上面的代码可以清晰看到这个框架的流程!通过Router 其实就处理url的类,通过Router可以获取哪个控制器、哪个方法!然后再执行方法!

标签:php,反射
0
投稿

猜你喜欢

  • Windows Server 2008之数据安全保护

    2008-12-04 12:49:00
  • python如何创建TCP服务端和客户端

    2021-05-20 04:52:52
  • 网站重构到底是什么

    2008-11-03 11:30:00
  • python队列Queue的详解

    2022-10-09 16:56:21
  • Python clip与range函数保姆级使用教程

    2022-05-22 09:53:42
  • keras小技巧——获取某一个网络层的输出方式

    2023-08-20 12:56:47
  • python 实现定时任务的四种方式

    2023-06-28 14:37:27
  • 基于Python实现批量保存视频到本地

    2023-10-14 12:24:27
  • Python的高级Git库 Gittle

    2023-06-14 14:52:05
  • Python socket处理client连接过程解析

    2022-04-30 15:44:31
  • Python多层装饰器用法实例分析

    2023-08-20 07:34:35
  • Python的Bottle框架中返回静态文件和JSON对象的方法

    2023-11-07 20:14:41
  • pyhton列表转换为数组的实例

    2021-01-12 08:14:31
  • python关键字and和or用法实例

    2023-12-19 20:07:40
  • MySQL使用变量实现各种排序

    2024-01-22 10:36:14
  • python Pillow图像处理方法汇总

    2021-09-08 18:02:45
  • django 解决manage.py migrate无效的问题

    2021-08-18 02:28:51
  • Python实战之多种音乐格式批量转换

    2023-07-12 20:24:42
  • 让字体美起来

    2011-06-14 09:50:21
  • Java常用正则表达式验证类完整实例【邮箱、URL、IP、电话、身份证等】

    2022-09-14 05:59:39
  • asp之家 网络编程 m.aspxhome.com