我讨厌变老,当我们力量衰弱的时候如果出现更强的敌人,我会觉得很恐怖,很遗憾。
### 基本说明
先定义一个User类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
class User{ public $username; private $password;
public function login() { echo "login"; }
public function register() { echo "registert"; } }
|
实例化并调用其中的方法
1 2
| $user = new User(); $user->login();
|
实例化User类的反射类并调用其中的一个方法
1 2
| $reUser = new \ReflectionClass('User'); var_dump($reUser->getFileName());
|
说明:ReflectionClass类获取类相关信息,如获取属性、方法、文档注释等;
实际应用
- 通过_call可以调用类一些不确定的方法,这个时候就可以通过反射类ReflectionClass来判断类方法是否存在,是不是可见可调用的。
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 32 33 34 35 36 37 38 39 40 41 42 43
| <?php class A{ public function actionA(){ echo "I'am A\n"; } } class B{ private function actionB (){ echo "I'am B\n"; } } class test{ private $objects; public function __construct(){ $this->objects=array(); } public function add($t){ $this->objects[]=$t; } private function pp(){ } public function __call($name,$args){ foreach($this->objects as $object){ $class=new ReflectionClass($object); if(!$class->hasMethod($name)){ continue; } $method=$class->getMethod($name); if($method&&$method->isPublic()&&!$method->isAbstract()){ $method->invoke($object,$args); return ; } } echo "not method!\n"; } } $t=new test(); $t->add(new A()); $t->add(new B()); $t->pp(); $t->actionA(); $t->actionB();
|