很多东西在就算知道也没啥用。比如php反射类,以前翻看手册时也看过,但就是不知道有啥用。官网介绍:PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。最近看了深入 Laravel 核心 ,其中介绍到Laravel的Ioc容器就是依靠php反射类的实现才算明白,于是又看了一遍php反射类,顺便记录一下。
ReflectionClass 类报告了一个类的有关信息。
ReflectionClass::getConstructor — 获取类的构造函数
ReflectionClass::getName — 获取类名
ReflectionClass::newInstance — 从指定的参数创建一个新的类实例
ReflectionClass::getMethod — 获取一个类方法
ReflectionMethod::setAccessible — 设置方法是否访问
ReflectionMethod::invoke — 执行一个反射的方法
ReflectionFunctionAbstract::getParameters — 获取参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php class Test { public $num; function __construct($num = 0) { $this->num = $num; }
public function getNum() { return $this->num; }
private function _modifyNum($num) { if($num){ $this->num = $num; } } }
$reflection = new ReflectionClass('Test'); echo $reflection->getName(),PHP_EOL; $test = $reflection->newInstance(1); echo $test->getNum(),PHP_EOL; $method = $reflection->getmethod('_modifyNum'); print_r($method->getParameters()); $method->setAccessible(true); $method->invoke($test,2); echo $test->getNum(),PHP_EOL;
|
以上程序输出:
1 2 3 4 5 6 7 8 9 10
| Test 1 Array ( [0] => ReflectionParameter Object ( [name] => num ) ) 2
|