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
);
}
|
-
实现ReflectionClass对象
-
实现ReflectionMethod对象
-
实现ReflectionParameter对象
-
通过反射实现对象的依赖注入
-
本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/2053752,如需转载请自行联系原作者