php 的反射详解及示例代码

 最近在看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)

相关推荐

  • PHP反射使用实例和PHP反射API的中文说明

    最近在开发过程中需要获取某个类方法的参数数量.名称及参数顺序,好根据参数的名称来从$_GET里取值. 如方法原型为test($uid,$score), 那么我就知道需要需要从$_GET取 复制代码 代码如下: $uid = $_GET['uid']; $score = $_GET['score']; 然后调用方法$obj->test($uid,$score) 当然前提是约定好了参数名称和get方法传值变量名一致. 采用PHP的反射API,获得函数参数名称和参数默认值的方法如下: 复制代码 代码如

  • 在PHP中使用反射技术的架构插件使用说明

    反射API的插件方法是基于在运行时决定程序的功能来实现的,也就是说,它允许创建可选的接口方法,并在首次使用时检测到这部分接口方法,只有在插件中存在这部分接口的情况下,它们才会被用到. 假设拥有这样的接口 复制代码 代码如下: interface IPlugin{ function getMenuItems(); function getArticles(); function getSideBars(); } class Someplugin implelents IPlugin{ public

  • PHP反射类ReflectionClass和ReflectionObject的使用方法

    PHP中的扩展反射类,该扩展用来分析php程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括注释.看一个这样的问题,php类的成员变量没有在类中声明,而是在函数中声明,有什么不同? 复制代码 代码如下: class test{    private $name;    private $sex;    function __construct(){        $this->aaa='aaa';    }} $test=new test(); $reflect=new Reflect

  • php反射应用示例

    复制代码 代码如下: <?phpfunction custom(){} class custom{   public function index(){ } }print_r(get_define_position('custom')); /**  * /  * @param  string $name  函数名或者类名  * @return array         */ function get_define_position($name){    $info = array();   

  • PHP 反射机制实现动态代理的代码

    演示用代码如下所示:  复制代码 代码如下: <?php class ClassOne { function callClassOne() { print "In Class One"; } } class ClassOneDelegator { private $targets; function __construct() { $this->target[] = new ClassOne(); } function __call($name, $args) { fore

  • PHP的反射类ReflectionClass、ReflectionMethod使用实例

    PHP5 具有完整的反射API,添加对类.接口.函数.方法和扩展进行反向工程的能力. 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括注释.这种动态获取的信息以及动态调用对象的方法的功能称为反射API.反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用. 其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言. PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注

  • 解析php中反射的应用

    一  反射的使用: 复制代码 代码如下: <?phpclass Person{ public $name; function __construct($name){  $this->name=$name; }}interface Module{ function execute();}class FtpModule implements Module{ function setHost($host){  print "FtpModule::setHost():$host\n"

  • PHP类的反射用法实例

    本文实例讲述了PHP类的反射用法.分享给大家供大家参考.具体实现方法如下: 该例实现对于每个频道获取相应的类来执行相应的操作.具体如下: 复制代码 代码如下: foreach($this->chs as $ch) { $className = $this->chsMap[$ch];     if($className) { // 如果是合法的类名   // 获取反射类  $class = new ReflectionClass($className);  // 获取类的方法   $recd =

  • PHP反射机制用法实例

    本文实例讲述了PHP反射机制的用法,分享给大家供大家参考之用.具体方法如下: 演示示例代码如下所示: <?php class ClassOne { function callClassOne() { print "In Class One"; } } class ClassOneDelegator { private $targets; function __construct() { $this->target[] = new ClassOne(); } function

  • PHP中的reflection反射机制测试例子

    Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射.尝试着用java的思想去理解php的反射,跟java基本上基本一致.参考了php手册:http://www.php.net/manual/zh/book.reflection.php. ReflectTest.php: <?php   class ReflectTest {       /**      * 用户ID      */     private $userId;       /**      * 用

随机推荐