威尼斯正规官网这种动态获取的信息以及动态调用对象的方法的功能称为反射API
分类:热门资源

一  反射的使用: 复制代码 代码如下:

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。

class Person{
 public $name;
 function __construct($name){
  $this->name=$name;
 }
}
interface Module{
 function execute();
}
class FtpModule implements Module{
 function setHost($host){
  print "FtpModule::setHost():$hostn";
 }
 function setUser($user){
  print "FtpModule::setUser():$usern";
 }
 function execute(){
  //something
 }
}
class PersonModule implements Module{
 function setPerson(Person $person){
  print "PersonModule::setPerson:{$person->name}n";
 }
 function execute(){
  //something
 }
}
class ModuleRunner{
 private $configData
        =array(
          "PersonModule"=>array('person'=>'bob'),
          "FtpModule"=>array('host'=>'example.com','user'=>'anon')
        );
 private $modules=array();
 function init(){
  $interface=new ReflectionClass('Module');
  foreach($this->configData as $modulename=>$params){
   $module_class=new ReflectionClass($modulename);//根据配置configData的名称,实例化ReflectionClass
   if(!$module_class->isSubclassOf($interface)){//检查反射得到了类是否是$interface的子类
    throw new Exception("unknown module type:$modulename");//不是Module子类则抛出异常
   }
   $module=$module_class->newInstance();//实例化一个FtpModule或者PersonModule对象
   foreach($module_class->getMethods() as $method){//获得类中的方法
    $this->handleMethod($module,$method,$params);
   }
   array_push($this->modules,$module);//将实例化的module对象放入$modules数组中
  }
 }
 function handleMethod(Module $module,ReflectionMethod $method,$params){
  $name=$method->getName();//获得方法名称
  $args=$method->getParameters();//获得方法中的参数
  if(count($args)!=1||substr($name,0,3)!="set"){//检查方法必须是以set开头,且只有一个参数
   return false;
  }
  $property=strtolower(substr($name,3));//讲方法名去掉set三个字母,作为参数
  if(!isset($params[$property])){//如果$params数组不包含某个属性,就返回false
   return false;
  }
  $arg_class=@$args[0]->getClass;//检查setter方法的第一个参数(且唯一)的数据类型
  if(empty($arg_class)){
   $method->invoke($module,$params[$property]);
  }else{
   $method->invoke($module,$arg_class->newInstance($params[$property]));
  }
 }
}
$test=new ModuleRunner();
$test->init();
?>

反射是什么?

二  通过反射获得类中信息: 复制代码 代码如下:

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

class ReflectionUtil{
 static function getClassSource(ReflectionClass $class){
  $path=$class->getFileName();
  $lines=@file($path);
  $from=$class->getStartLine();
  $to=$class->getEndLine();
  $len=$to-$from+1;
  return implode(array_slice($lines,$from-1,$len));
 }
}
$classname="Person";
$path="../practice/{$classname}.php";
if(!file_exists($path)){
  throw new Exception("No such file as {$path}");
}
require_once($path);
if(!class_exists($classname)){
 throw new Exception("No such class as {$classname}");
}
print ReflectionUtil::getClassSource(new ReflectionClass('Person'));
?>

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

结果是:class Person{ public $age; public $name; function getName(){return "zjx";} function getAge(){return 12;} function __toString(){ $rs=$this->getName(); $rs.="(age".$this->getAge().")"; return $rs; } }

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例,调用一个方法,传递参数,动态调用类的静态方法。反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:复制代码 代码如下:

/** * For the sake of demonstration, we"re setting this private */private $_allowDynamicAttributes = false;

/** * type=primary_autoincrement */protected $id = 0;

/** * type=varchar length=255 null */protected $name;

/** * type=text null */protected $biography;

public function getId() {return $this->id;}

public function setId {$this->id = $v;}

public function getName() {return $this->name;}

public function setName {$this->name = $v;}

public function getBiography() {return $this->biography;}

public function setBiography {$this->biography = $v;}}

一、通过ReflectionClass,我们可以得到Person类的以下信息:

1.常量 Contants2.属性 Property Names3.方法 Method Names静态4.属性 Static Properties5.命名空间 Namespace6.Person类是否为final或者abstract7.Person类是否有某个方法

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:复制代码 代码如下:$class = new ReflectionClass; // 建立 Person这个类的反射类 $instance = $class->newInstanceArgs; // 相当于实例化Person 类

1)获取属性:

复制代码 代码如下:$properties = $class->getProperties();foreach ($properties as $property) {echo $property->getName() . "n";}// 输出:// _allowDynamicAttributes// id// name// biography

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

复制代码 代码如下:$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

复制代码 代码如下:ReflectionProperty::IS_STATICReflectionProperty::IS_PUBLICReflectionProperty::IS_PROTECTEDReflectionProperty::IS_PRIVATE通过$property->getName()可以得到属性名。

2)获取注释:

通过getDocComment可以得到写给property的注释。

复制代码 代码如下:foreach ($properties as $property) {if ($property->isProtected {$docblock = $property->getDocComment();preg_match /', $property->getDocComment;echo $matches[1] . "n";}}// Output:// primary_autoincrement// varchar// text

3)获取类的方法

复制代码 代码如下:getMethods() 来获取到类的所有methods。hasMethod 是否存在某个方法getMethod 获取方法

4)执行类的方法:复制代码 代码如下:$instance->getName(); // 执行Person 里的方法getName// 或者:$method = $class->getmethod;// 获取Person 类中的getName方法$method->invoke;// 执行getName 方法// 或者:$method = $class->getmethod;// 获取Person 类中的setName方法$method->invokeArgs($instance, array;

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

1.是否“public”、“protected”、“private” 、“static”类型2.方法的参数列表3.方法的参数个数4.反调用类的方法复制代码 代码如下:// 执行detail方法$method = new ReflectionMethod;

if && !$method->isStatic {echo 'Action is right';}echo $method->getNumberOfParameters(); // 参数个数echo $method->getParameters(); // 参数对象数组

本文由威尼斯在线注册平台发布于热门资源,转载请注明出处:威尼斯正规官网这种动态获取的信息以及动态调用对象的方法的功能称为反射API

上一篇:威尼斯正规官网哪些获得数主管度只怕剖断二个数组个数呢 下一篇:没有了
猜你喜欢
热门排行
精彩图文