PHP反射类ReflectionClass

我讨厌变老,当我们力量衰弱的时候如果出现更强的敌人,我会觉得很恐怖,很遗憾。
### 基本说明 先定义一个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();