<?php
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類的以下資訊:
- 常量 Contants
- 屬性 Property Names
- 方法 Method Names靜態
- 屬性 Static Properties
- 名稱空間 Namespace
- Person類是否為final或者abstract
- Person類是否有某個方法
接下來反射它,只要把類名”Person”傳遞給ReflectionClass就可以了:
$class = new ReflectionClass(`Person`); // 建立 Person這個類的反射類
$instance = $class->newInstanceArgs($args); // 相當於例項化Person 類
1)獲取屬性(Properties):
$properties = $class->getProperties();
foreach ($properties as $property) {
echo $property->getName() . "
";
}
// 輸出:
// _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
通過$property->getName()可以得到屬性名。
2)獲取註釋:
通過getDocComment可以得到寫給property的註釋。
foreach ($properties as $property) {
if ($property->isProtected()) {
$docblock = $property->getDocComment();
preg_match(`/ type=([a-z_]*) /`, $property->getDocComment(), $matches);
echo $matches[1] . "
";
}
}
// Output:
// primary_autoincrement
// varchar
// text
3)獲取類的方法
- getMethods() 來獲取到類的所有methods。
- hasMethod(string) 是否存在某個方法
- getMethod(string) 獲取方法
4)執行類的方法:
$instance->getName(); // 執行Person 裡的方法getName
// 或者:
$method = $class->getmethod(`getName`); // 獲取Person 類中的getName方法
$method->invoke($instance); // 執行getName 方法
// 或者:
$method = $class->getmethod(`setName`); // 獲取Person 類中的setName方法
$method->invokeArgs($instance, array(`snsgou.com`));
二、通過ReflectionMethod,我們可以得到Person類的某個方法的資訊:
- 是否“public”、“protected”、“private” 、“static”型別
- 方法的引數列表
- 方法的引數個數
- 反呼叫類的方法
// 執行detail方法
$method = new ReflectionMethod(`Person`, `test`);
if ($method->isPublic() && !$method->isStatic()) {
echo `Action is right`;
}
echo $method->getNumberOfParameters(); // 引數個數
echo $method->getParameters(); // 引數物件陣列