PHP通過反射實現物件的成員方法呼叫

餘二五發表於2017-11-14
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
44
45
46
47
48
49
class Food
{
    public $name `apple`;
 
}
 
class Person
{
    const SEX = `boy`;
    public $name;
    private $age;
    protected $hobbies = [];
 
    public function eat(Food $foodObj, string $waterName):string
    {
        return "eatting {$foodObj->name},drinking {$waterName}";
    }
 
    public function hello()
    {
        return `Hello world`;
    }
}
 
$instance = (new ReflectionClass(`Person`))->newInstance();
$reflectionMethod new ReflectionMethod(`Person``eat`);
 
//校驗成員方法是否是public,可訪問的
if (!$reflectionMethod->isPublic()) {
    echo `不能訪問Person類的eat方法` . PHP_EOL;
    return;
}
 
//ReflectionParametr物件組成的陣列
$parameters $reflectionMethod->getParameters();
if (empty($parameters)) {
    echo $reflectionMethod->invoke($instance);
else {
    $args = [];
    foreach ($parameters as $parameterObj) {
        if ($reflectionclass $parameterObj->getClass()) {
            $className $reflectionclass->getName();
            $args[] = (new ReflectionClass($className))->newInstance();
        else {
            $args[] = `hello`;
        }
    }
    echo $reflectionMethod->invoke($instance, ...$args);
}


  1. 實現ReflectionClass物件

  2. 實現ReflectionMethod物件

  3. 實現ReflectionParameter物件

  4. 通過反射實現物件的依賴注入

本文轉自 hgditren 51CTO部落格,原文連結:http://blog.51cto.com/phpme/2053752,如需轉載請自行聯絡原作者


相關文章