实例介绍PHP的Reflection反射机制

作者: 关于计算机  发布:2019-09-23

PHP5加多了一项新的效用:Reflection。那个效应使得程序猿能够reverse-engineer class, interface,function,method and extension。通过PHP代码,就能够获得某object的保有新闻,而且能够和它交互。
假诺有二个类Person:

复制代码 代码如下:

class Person {
/**
* 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($v)
{
$this->id = $v;
}
public function getName()
{
return $this->name;
}
public function setName($v)
{
$this->name = $v;
}
public function getBiography()
{
return $this->biography;
}
public function setBiography($v)
{
$this->biography = $v;
}
}

透过ReflectionClass,我们得以博得Person类的以下新闻:
1.常量 Contants
2.属性 Property Names
3.方法 Method Names
4.静态属性 Static Properties
5.命名空中 Namespace
6.Person类是不是为final可能abstract

要是把类名"Person"传递给ReflectionClass就能够了:

复制代码 代码如下:

$class = new ReflectionClass('Person');

获得属性(Properties):

复制代码 代码如下:

$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_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE

借使要同一时间获得public 和private 属性,就这么写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
相应不会感到不熟悉吧。

经过$property->getName()能够收获属性名,通过getDocComment能够拿走写给property的笺注。

复制代码 代码如下:

foreach($properties as $property) {
if($property->isProtected()) {
$docblock = $property->getDocComment();
preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
echo $matches[1]."n";
}
}
// Output:
// primary_autoincrement
// varchar
// text

些微匪夷所思了啊。竟然连注释都得以取到。
获得情势(methods):通过getMethods() 来收获到类的有所methods。重返的是ReflectionMethod对象的数组。不再演示。
最终经过ReflectionMethod来调用类里面的method。

复制代码 代码如下:

$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");
foreach($data as $key => $value) {
if(!$class->hasProperty($key)) {
throw new Exception($key." is not a valid property");
}

if(!$class->hasMethod("get".ucfirst($key))) {
throw new Exception($key." is missing a getter");
}

if(!$class->hasMethod("set".ucfirst($key))) {
throw new Exception($key." is missing a setter");
}

// Make a new object to interact with
$object = new Person();

// Get the getter method and invoke it with the value in our data array
$setter = $class->getMethod("set".ucfirst($key));
$ok = $setter->invoke($object, $value);

// Get the setter method and invoke it
$setter = $class->getMethod("get".ucfirst($key));
$objValue = $setter->invoke($object);

// Now compare
if($value == $objValue) {
echo "Getter or Setter has modified the data.n";
} else {
echo "Getter and Setter does not modify the data.n";
}
}

稍加意思吧。

本文由贝博体育app发布于关于计算机,转载请注明出处:实例介绍PHP的Reflection反射机制

关键词:

上一篇:静态页面的值传递
下一篇:没有了