初见PHP反射
来源:互联网 发布:商标制作软件 编辑:程序博客网 时间:2024/04/29 06:24
什么是反射?指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于这个类的方法、属性、参数、注释等信息。通俗来说就是获取该类的信息,至于你要获取来干嘛,这个就看你自己的需求了。下面是一个小例子:
效果:
class Test{public $name;public $age;public static function show(){echo 'this is show action';}public function del(){echo $this->name;}public function __set($name,$value){$this->$name = $value;}public function __get($name){if(isset($thsi->$name)){return $this->$name;}else{echo 'error';}}}$obj = new Test();$obj->name = 'lu';$obj->age = 5;//Reflection 反射类//以对象作为反射的对象$res = new ReflectionObject($obj);//以类作为反射的对象两个效果相同//$res = new ReflectionClass('Test');//获取$obj对象的一组属性,返回一个数组 里面包含 属性名 和 所属类$p = $res->getProperties();//var_dump($p);$m = $res->getMethods();//var_dump($m);
array(2) { [0]=> &object(ReflectionProperty)#2 (2) { ["name"]=> string(4) "name" ["class"]=> string(4) "Test" } [1]=> &object(ReflectionProperty)#3 (2) { ["name"]=> string(3) "age" ["class"]=> string(4) "Test" }}
array(4) { [0]=> &object(ReflectionMethod)#5 (2) { ["name"]=> string(4) "show" ["class"]=> string(4) "Test" } [1]=> &object(ReflectionMethod)#6 (2) { ["name"]=> string(3) "del" ["class"]=> string(4) "Test" } [2]=> &object(ReflectionMethod)#7 (2) { ["name"]=> string(5) "__set" ["class"]=> string(4) "Test" } [3]=> &object(ReflectionMethod)#8 (2) { ["name"]=> string(5) "__get" ["class"]=> string(4) "Test" }}
甚至还可以获取该类的原型:
$obj = new ReflectionClass('Test');//获取类名 $class_name = $obj->getName();$m = array();$p = array();//获取该类的属性 返回一个数组对象 我们把它遍历出来 foreach($obj->getProperties() as $v){//$V 是一个 ReflectionProperty该类报告了类的属性的相关信息。 $p[$v->getName()] = $v;}/*array(2) { ["name"]=> object(ReflectionProperty)#2 (2) { ["name"]=> string(4) "name" ["class"]=> string(4) "Test" } ["age"]=> object(ReflectionProperty)#3 (2) { ["name"]=> string(3) "age" ["class"]=> string(4) "Test" }}*///获取方法foreach($obj->getmethods() as $v){//$V 是一个 ReflectionMethod类报告了一个方法的有关信息。$m[$v->getName()] = $v;}/*array(4) { ["show"]=> object(ReflectionMethod)#4 (2) { ["name"]=> string(4) "show" ["class"]=> string(4) "Test" } ["del"]=> object(ReflectionMethod)#5 (2) { ["name"]=> string(3) "del" ["class"]=> string(4) "Test" } ["__set"]=> object(ReflectionMethod)#6 (2) { ["name"]=> string(5) "__set" ["class"]=> string(4) "Test" } ["__get"]=> object(ReflectionMethod)#7 (2) { ["name"]=> string(5) "__get" ["class"]=> string(4) "Test" }}*///拼凑字符串 组成类的形式echo "class {$class_name}\n{\n";//ksort 对数组按照键名逆向排序 is_array($p)&&ksort($p);foreach($p as $k => $v){//此时 $v 还是一个 ReflectionProperty 的一个对象echo "\t";echo $v->isPublic() ? 'public' : '';echo $v->isPrivate() ? 'private' : '';echo $v->isProtected() ? 'protected' : '';echo "\t{$k}\n";}echo "\n";is_array($m)&&ksort($m);foreach($m as $k => $v){//此时 $v 还是一个 ReflectionProperty 的一个对象echo "\tfunction {$k}(){}\n";}echo "}\n";
效果:
class Test{publicagepublicnamefunction __get(){}function __set(){}function del(){}function show(){}}
0 0
- 初见PHP反射
- 初见-Java的反射机制
- php之初见
- [php] 初见之HelloWorld
- Java反射机制之初见端倪
- 初见
- 初见
- 初见
- 初见
- 初见
- php反射
- PHP反射
- php反射
- PHP反射
- php 反射
- PHP反射
- php 反射
- PHP--反射
- 直方图均衡
- 癫痫病是怎么引起的 02bamvwz
- thinkphp实现无限极分类
- 十天学Linux内核之第八天---构建Linux内核
- SSH Maven pom.xml 备忘
- 初见PHP反射
- DecimalFormat
- 癫痫病人能活多久 02crqn2g
- Android应用随系统编译makefile中如何添加so库
- poj2718
- Unity3D之监听Hierachy、Project等视图结构变化的事件
- linux内核部件分析(一)——连通世界的list
- 扬州汊河门面房出租 02cuuudz
- Unity3D 运营商支付安卓打包的陷阱 libunicomsdk.jar详解