如何实现一个php框架系列文章【2】实现类的自动加载

时间:2022-09-16 09:04:03
根据前一篇文章的设计原则,我们暂时把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函数

123456789101112131415161718192021222324252627 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);}

 

如果想使用另一个模块里的函数可以使用

1234567891011121314 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;}