0

PHP反射类 ReflectionClass

Posted by 撒得一地 on 2016年2月1日 in PHP笔记
上一篇:
下一篇:

最近碰到一个PHP反射类函数ReflectionClass,发现其功能很多,非常好用,下面做下总结。

什么是PHP反射类,字面上可以简单的理解为一个类的映射。官方文档给出的解释是,ReflectionClass 类报告了一个类的有关信息。什么鬼?解释后还是感觉有点抽象。看到一个更通俗的解释,反射返回的对象类(class)的元数据对象(包含class的所有属性/方法的元数据信息),但不是该类本身;类似于查到了类的户口档案,但户口档案不是类本身!如果还是有点抽象,直接看例子会好点:

class member_service {
    const TYPE_ADMIN = 1; 
    const TYPE_REGISTER = 2; 
    const TYPE_TOURIST = 3;

    private $age = 21;
    public $name = 'jack';

    private function fun1() {
        echo "这是一个私有函数!";
    }    

    public function fun2() {
        echo "这是个公共函数!";
    }    
}

然后创建一个member_service反射类:

$class = new ReflectionClass('member_service');

如果你想获取反射类中的某个常量,可以调用反射类方法:public mixed getConstant ( string $name ),比如:

//获取TYPE_REGISTER这个常量的值
echo $class-> getConstant('TYPE_REGISTER'); //输出2

如果你想获取反射类中全部常量的值,可以调用反射类方法:public array getConstants ( void ),该方法以数组的形式返回全部常量的值,比如:

 print_r($class-> getConstants());

 //输出结果
 /*
 Array
(
    [TYPE_ADMIN] => 1
    [TYPE_REGISTER] => 2
    [TYPE_TOURIST] => 3
)
 */

如果想获得反射类属性,可以使用:public array getDefaultProperties ( void ),该反射类方法以数组键值对的形式返回,比如:

print_r($class->getDefaultProperties()); 

/*输出结果:
Array
(
    [age] => 21
    [name] => jack
)
*/

如果想获得反射类下面的某个具体方法,可以使用:public ReflectionMethod getMethod ( string $name ),比如:

echo  $class->getMethod('fun1');

/*输出结果:
Method [  private method fun1 ] {
  @@ /usercode/file.php 16 - 18
}
*/ 

如果想获得反射类下面的所有方法,可以使用:public array getMethods ([ int $filter ] ),将以数组的形式返回结果,比如:

print_r($class->getMethods());

/*输出结果
Array
(
    [0] => ReflectionMethod Object
        (
            [name] => __construct
            [class] => member_service
        )
    [1] => ReflectionMethod Object
        (
            [name] => fun1
            [class] => member_service
        )
    [2] => ReflectionMethod Object
        (
            [name] => fun2
            [class] => member_service
        )
)*/

如果想根据反射类,生成具体类实例,可以使用:public object newInstance ( mixed $args [, mixed $… ] )或者使用
public object newInstanceArgs ([ array $args ] ),比如:

//相当于实例化 member_service 类  
$new_instance = $class->newInstance();
var_dump($new_instance);

/*上面输出:
object(member_service)#2 (2) {
  ["age":"member_service":private]=>
  int(21)
  ["name"]=>
  string(4) "jack"
}
*/

可以对生成的实例类进行方法调用,和new生成类时调用方法一致,比如:

$new_instance->fun2();
$new_instance->fun1();

/*上面输出:
这是个公共函数!PHP Fatal error:  Call to private method member_service::fun1() 
from context '' in /usercode/file.php on line 32
*/

和new一样,实例化的类不能调用私有方法和属性。

关于反射类的方法还有很多,更多的方法可以参考官方文档:http://www.php.net/manual/zh/class.reflectionclass.php。

标签:

上一篇:

下一篇:

相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注

4 + 2 = ?

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.