初见PHP反射

什么是反射?指在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
{
	public	age
	public	name

	function __get(){}
	function __set(){}
	function del(){}
	function show(){}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值