如何实现一个php框架系列文章【2】实现类的自动加载
根据前一篇文章的设计原则,我们暂时把php文件分为3类,类名和文件名都遵守如下约定。
| 类名 | 文件名 | 路径 | |
| 模型类m | {$app}Mod | {$app}.mod.php | {$app}/model |
| 控制器类c | {$app}Ctl | {$app}.ctl.php | {$app}/control |
| 其他 | {$app} | {$app}.cls.php | {$app}/class |
可以实现一个简单的autoload函数
|
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
|
function uct_autoload($class_name) { $auto_path = array( 'ctl' => 'control', 'mod' => 'model', 'cls' => 'class', ); $key = strtolower(substr($class_name, -3)); if (isset($auto_path[$key])) { $dir = $auto_path[$key] . DS . strtolower(substr($class_name, 0, -3)) . '.' . $key . '.php'; } else { $dir = 'class' . DS . strtolower($class_name) . '.cls.php'; } if (!empty($GLOBALS['_UCT']['autoload'])) { foreach ($GLOBALS['_UCT']['autoload'] as $app) { if (file_exists(UCT_PATH . 'app' . DS . $app . DS . $dir)) { return include UCT_PATH . 'app' . DS . $app . DS . $dir; } } } if (file_exists(UCT_PATH . 'framework' . DS . $dir)) { return include UCT_PATH . 'framework' . DS . $dir; } echo 'auto_load not found! ' . $class_name; exit(1);} |
如果想使用另一个模块里的函数可以使用
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function uct_use_app($app) { if (empty($GLOBALS['_UCT']['autoload'])) { $GLOBALS['_UCT']['autoload'] = array( $app ); return true; } if (!in_array($app, $GLOBALS['_UCT']['autoload'])) { array_unshift($GLOBALS['_UCT']['autoload'], $app); return true; } return false;} |
浙公网安备 33010602011771号