php 反射机制 文档注释,PHP反射机制

什么是反射呢?

在PHP的面向对象编程中的对象,它被系统赋予自省的能力,而这个自省的过程,我们把它叫做反射。

我们对反射的直观理解可以是,根据达到地,找到出发地和来源这么一个过程,通俗来讲就是,我给你一个光秃秃的对象,完事你可以根据这个对象,知道它所属的类,拥有哪些方法。

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

我们接下来通过一段代码来感受下:

class person{

public $name;

public $age;

public function say()

{

echo $this->name."
".$this->age;

}

public function set($name,$value)

{

echo 'set name to value';

$this->$name = $value;

}

public function get($name)

{

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

echo 'unset name';

$this->$name = 'seting~~~';

}

return $this->$name;

}

}

$stu = new person();

$stu->name = 'luyaran';

$stu->age = 26;

$stu->sex = 'girl';

上述代码是一个简单的类,我们通过实例化它,以及赋值,让它含有意义。

完事,我们就来通过反射API获取这个stu对象的方法和属性的一个列表:

//获取对象的属性列表

$reflect = new ReflectionObject($stu);

$props = $reflect->getProperties();

foreach ($props as $key_p => $value_p) {

var_dump($value_p->getName());

}

//获取对象的方法列表

$method = $reflect->getMethods();

foreach ($method as $key_m => $value_m) {

var_dump($value_m->getName());

}

除了反射API之外,我们还可以使用class函数来获取对象的各种属性以及方法的数据,如下:

// 获取对象的属性的关联数组

var_dump(get_object_vars($stu));

//获取类属性

var_dump(get_class_vars(get_class($stu)));

//获取类的方法名称组成的数组

var_dump(get_class_methods(get_class($stu)));

值得一说的是,这个get_class这个函数,还可以获取从其他页面传递过来的对象的属性列表以及所属的类。

不过,class函数和反射API相比较起来,个人感觉还是后者更胜一筹啊。

反射API甚至可以还原这个类的原型,包括方法的访问权限,来看代码感受下:

//实例化反射API获取类名

$obj = new ReflectionObject($stu);

$class_name = $obj->getName();

$method_arr = $props_arr = array();

//获取对象的属性列表

$props = $obj->getProperties();

foreach ($props as $key_p => $value_p) {

$props_arr[$value_p->getName()] = $value_p;

}

//获取对象的方法列表

$method = $obj->getMethods();

foreach ($method as $key_m => $value_m) {

$method_arr[$value_m->getName()] = $value_m;

}

//格式化输出类的属性以及方法

echo "class $class_name { \n";

is_array($props_arr) && ksort($props_arr);

foreach ($props_arr as $key_o => $value_o) {

echo "\t";

echo $value_o->isPublic() ? 'public' : ' ' ,$value_o->isPrivate() ? 'private' : ' ' ,$value_o->isProtected() ? 'protected' : ' ' ,$value_o->isStatic() ? 'static' : ' ';

echo "\t$value_o\n";

}

echo "\n";

is_array($method_arr) && ksort($method_arr);

foreach ($method_arr as $key_e => $value_e) {

echo "\t";

echo $value_e->isPublic() ? 'public' : ' ' ,$value_e->isPrivate() ? 'private' : ' ' ,$value_e->isProtected() ? 'protected' : ' ';

echo "\tfunction $value_e () {} \n";

}

echo '}';

根据上述代码,输出结果如下:

8ec13121dbf26ffe69b18d8c91027ff3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值