Контроллер, основанный на механизме рефлексии

 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
<?
abstract class Module {
public final function buildPage($action) {
do{
//нельзя вызвать функции, начинающиеся с подчеркивания
//(общепринятое соглашение считать их приватными)
if (substr($action, 0, 1) == '_' or empty($action))
break;
//нельзя вызвать функции описанные в абстрактном классе, они для работы системы
if (method_exists(__CLASS__, $action))
break;
if (!method_exists($this, $action))
break;
$method = new ReflectionMethod($this, $action);
//доступны только публичные методы
if (!$method->isPublic())
break;
return $this->$action();
}while(false);
return $this->error404();
}
public function error404(){
echo 'такой страницы нет в системе';
}
}
class ExampleModule extends Module{
function hello(){
echo 'hello World!';
}
function test(){
echo 'Тест!!!';
}
protected function inner(){
echo 'это внутренняя функция не доступна контроллеру!';
}
}
$module=new ExampleModule();
$module->buildPage(isset($_GET['action'])?$_GET['action']:'');
?>