php中的反射机制

PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。

请注意部分内部 API 丢失了反射扩展工作所需的代码。 例如,一个内置的 PHP 类可能丢失了反射属性的数据。这些少数的情况被认为是错误,不过, 正因为如此,它们应该被发现和修复。

举个栗子吧,我有个Person类

/**
 * Class Person
 * php反射获取类相关信息
 * @author lightWay
 * @version 1.2
 * @since 1.0
 */
class Person {
    protected $gender; //性别
    private $age; //年龄
    public $name; //姓名
    static $num; //统计多少人
    const HOME = 'china'; //家乡

    /**
     * Person constructor.
     * @param $name string 姓名
     * @param $age integer 年龄
     * @param $gender string 性别
     */
    public function __construct($name,$age,$gender)
    {
        $this->name = $name;
        $this->age = $age;
        $this->gender = $gender;
        self::$num++;
    }

    /**
     * 说出自己的名字
     */
    public function sayMyName()
    {
        echo 'my name is ',$this->name;
    }

    /**
     * 说出自己的性别
     */
    protected function sayMySex()
    {
        echo 'my sex is ',$this->gender;
    }

    /**
     * 说出自己的年龄
     */
    private function sayMyAge()
    {
        echo 'my age is ',$this->age;
    }

    /**
     * @param $val string 需要格式化打印的数据
     */
    public static function pp($val)
    {
        echo "<pre>";
        var_dump($val);
    }
}
传统的方式,想窥探类的内部怎么做呢,get_class系列函数

$person = new Person('lightWay','24','male');

//常规的做法

Person::pp(get_class($person)); //根据对象名返回类名

Person::pp(get_class_methods('Person')); //根据类名返回类的方法名组成的数组

Person::pp(get_class_vars('Person')); //根据类名返回类的默认属性组成的数组,公有属性

Person::pp(get_object_vars($person)); //根据对象名回有对象属性组成的关联数组,公有属性

var_dump($person);  //直接var_dump()方式打印对象




很多方法并不能完全窥探到类的内部,get_class_vars方法和get_object_vars方法,都是只能看到公共的属性,get_class_methods也只能看到公有的方法。

尝试下用php的放射机制看看:

//反射做法
$reflection = new ReflectionClass('Person');

$properties = $reflection->getProperties(); //获取所有类属性

$methods = $reflection->getMethods(); //获取所有的方法

$constants = $reflection->getConstants(); //获取所有的常量信息

//获取类注释
print_r($reflection->getDocComment());

//输出所有方法的注释
foreach ($methods as $i)
{
    Person::pp($i->getDocComment());
}

//打印所有成员属性
foreach ($properties as $v)
{
    echo $v->getName(),'<br />';
}

//打印所有方法名称
foreach ($methods as $v)
{
    echo $v->getName(),'<br />';
}


默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

//只要私有的属性
Person::pp($reflection->getProperties(ReflectionProperty::IS_PRIVATE));
可用参数列表:
ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED


不过这样也是很麻烦的,如果我是想看整个类的内部呢,有没有一个可以直接打印一个类,让人一目了然,当然有,

//输出整个类结构
echo "<pre>";
Reflection::export($reflection);


比var_dump强太多了吧!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值