PHP中的reflection反射机制测试例子
Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。
ReflectTest.php:
<?php
classReflectTest{
/**
*用户ID
*/
private$userId;
/**
*用户名
*/
private$userName;
/**
*用户密码
*/
private$password;
/**
*用户邮箱
*/
private$email;
/**
*用户QQ号码
*/
private$qq;
/**
*登陆次数
*/
private$loginTimes;
publicfunctionReflectTest(){
}
publicfunction__construct($userId,$userName,$password){
$this->userId=$userId;
$this->userName=$userName;
$this->password=$password;
}
/**
*
*@returnthe$userId
*/
publicfunctiongetUserId(){
return$this->userId;
}
/**
*
*@returnthe$userName
*/
publicfunctiongetUserName(){
return$this->userName;
}
/**
*
*@returnthe$password
*/
publicfunctiongetPassword(){
return$this->password;
}
/**
*
*@returnthe$email
*/
publicfunctiongetEmail(){
return$this->email;
}
/**
*
*@returnthe$qq
*/
publicfunctiongetQq(){
return$this->qq;
}
/**
*
*@returnthe$loginTimes
*/
publicfunctiongetLoginTimes(){
return$this->loginTimes;
}
/**
*
*@paramfield_type$userId
*/
publicfunctionsetUserId($userId){
$this->userId=$userId;
}
/**
*
*@paramfield_type$userName
*/
publicfunctionsetUserName($userName){
$this->userName=$userName;
}
/**
*
*@paramfield_type$password
*/
publicfunctionsetPassword($password){
$this->password=$password;
}
/**
*
*@paramfield_type$email
*/
publicfunctionsetEmail($email){
$this->email=$email;
}
/**
*
*@paramfield_type$qq
*/
publicfunctionsetQq($qq){
$this->qq=$qq;
}
/**
*
*@paramfield_type$loginTimes
*/
publicfunctionsetLoginTimes($loginTimes){
$this->loginTimes=$loginTimes;
}
}
?>
Test.php:
<?php
require_once'ReflectTest.php';
$ref=newReflectTest("1","admin","admin888");//实例化ReflectTest
echo"<h1>ReflectTestinit.</h1><br/>UserId:".$ref->getUserId()."<br/>UserName:".$ref->getUserName()."<br/>Password:".$ref->getPassword();
$class=newReflectionClass('ReflectTest');//反射加载ReflectTest类
$instance=$class->newInstanceArgs(array('123','root','123456'));//ReflectTest初始化
echo"<h1>Field:</h1><br/>";
$field=$class->getProperties();
foreach($fieldas$f){
echo$f->getName()."<br/>";//反射输出所有的成员变量
}
echo"<h1>getFieldsDocComment:</h1><br/>";
foreach($fieldas$f){
$docComment=$f->getDocComment();//反射输出所有成员变量的文档注释
echo$docComment."<br/>";
}
$method=$class->getMethods();//获取ReflectTest所有方法
echo"<h1>getMethodsDocComment:</h1><br/>";
foreach($methodas$m){
$docComment=$m->getDocComment();//获取所有方法的文档注释
echo$docComment."<br/>";
}
echo"<h1>getMethods:</h1><br/>";
foreach($methodas$m){
$k="get";//只调ReflectTest中的所有的get方法
echo$m->getName()."=".($k===""||strpos($m->getName(),$k)===0?$m->invoke($instance):"")."<br/>";
if("setQq"==$m->getName()){
$m->invoke($instance,'441637262');//调用setQq方法为ReflectTest当中的成员变量qq设值
}
}
echo"<h1>Invoke(set/get)Qqresult:</h1><br/>";
$qq=$class->getmethod('getQq');//获取getQq方法
echo"getQQ:".$qq->invoke($instance)."<br/>";//获取成员变量qq的值
echo"jb51.net";
?>
请求http://localhost/php/test/Test.php输出结果:
ReflectTestinit. UserId:1 UserName:admin Password:admin888 Field: userId userName password email qq loginTimes getFieldsDocComment: /***用户ID*/ /***用户名*/ /***用户密码*/ /***用户邮箱*/ /***用户QQ号码*/ /***登陆次数*/ getMethodsDocComment: /****@returnthe$userId*/ /****@returnthe$userName*/ /****@returnthe$password*/ /****@returnthe$email*/ /****@returnthe$qq*/ /****@returnthe$loginTimes*/ /****@paramfield_type$userId*/ /****@paramfield_type$userName*/ /****@paramfield_type$password*/ /****@paramfield_type$email*/ /****@paramfield_type$qq*/ /****@paramfield_type$loginTimes*/ getMethods: ReflectTest= __construct= getUserId=123 getUserName=root getPassword=123456 getEmail= getQq= getLoginTimes= setUserId= setUserName= setPassword= setEmail= setQq= setLoginTimes= Invoke(set/get)Qqresult: getQQ:441637262 jb51.net