<?php class HelloWorld { public function sayHelloTo($name) { return 'Hello ' . $name; } } $reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo'); echo $reflectionMethod->invoke(new HelloWorld(), 'Mike'); ?> 以上例程会输出: Hello Mike
1.如何通过地址栏参数来得到模块名称和控制器名称(即使在有路由和开了重写模块的情况下)
在之前的博文中已经有了比较详细的说明:http://my.oschina.net/u/1178986/blog/201206003
2.tp是如何实现前置,后置方法功能模块,和如何执行带参数的方法?
php系统自带的 ReflectionClass,ReflectionMethod 类,可以反射用户自定义类的中属性,方法的权限和参数等信息,通过这些信息可以准确的控制方法的执行
ReflectionClass: 详情
主要用的方法: hasMethod(string) 是否存在某个方法
getMethod(string) 获取方法
ReflectionMethod : 详情
主要方法: getNumberOfParameters() 获取参数个数
getParamters() 获取参数信息
3.代码演示
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
50
51
52
53
54
55
|
<?php
class
IndexAction{
public
function
index(){
echo
'index'
.
"\r\n"
;
}
public
function
test(
$year
=2012,
$month
=2,
$day
=21){
echo
$year
.
'--------'
.
$month
.
'-----------'
.
$day
.
"\r\n"
;
}
public
function
_before_index(){
echo
__FUNCTION__
.
"\r\n"
;
}
public
function
_after_index(){
echo
__FUNCTION__
.
"\r\n"
;
}
}
//执行index方法
$method
=
new
ReflectionMethod(
'IndexAction'
,
'index'
);
//进行权限判断
if
(
$method
->isPublic()){
$class
=
new
ReflectionClass(
'IndexAction'
);
//执行前置方法
if
(
$class
->hasMethod(
'_before_index'
)){
$beforeMethod
=
$class
->getMethod(
'_before_index'
);
if
(
$beforeMethod
->isPublic()){
$beforeMethod
->invoke(
new
IndexAction);
}
}
$method
->invoke(
new
IndexAction);
//执行后置方法
if
(
$class
->hasMethod(
'_after_index'
)){
$beforeMethod
=
$class
->getMethod(
'_after_index'
);
if
(
$beforeMethod
->isPublic()){
$beforeMethod
->invoke(
new
IndexAction);
}
}
}
//执行带参数的方法
$method
=
new
ReflectionMethod(
'IndexAction'
,
'test'
);
$params
=
$method
->getParameters();
foreach
(
$params
as
$param
){
$paramName
=
$param
->getName();
if
(isset(
$_REQUEST
[
$paramName
]))
$args
[] =
$_REQUEST
[
$paramName
];
elseif
(
$param
->isDefaultValueAvailable())
$args
[] =
$param
->getDefaultValue();
}
if
(
count
(
$args
)==
$method
->getNumberOfParameters())
$method
->invokeArgs(
new
IndexAction,
$args
);
else
echo
'parameters is not match!'
;
|
运行结果: