page contents

PHP 项目实践中的自动加载实现

兼容了两种方式,命名空间对应目录的方式 \app\test,类名下划线分割对应目录的方式app_test,都是对应的app目录下的test.php文件,类名要和文件名一致


attachments-2020-04-ZnhRxWa35e9e86ed17b45.png


使用spl_autoload_register函数注册一个自己定义的自动加载函数


当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中


兼容了两种方式,命名空间对应目录的方式 \app\test,类名下划线分割对应目录的方式app_test,都是对应的app目录下的test.php文件,类名要和文件名一致


set_include_path(),可以有多个用冒号:隔开,动态设置php.ini中的include_path 配置选项


 <?php
class Application {
    private static $instance    = null;
    private $libPath            = './';
    private $phpExt             = '.php';
    public function setLibPath($path, $autoload = false) {
        $this->libPath = trim(trim($path), DIRECTORY_SEPARATOR);
        set_include_path($this->getLibPath());
        if ($autoload) {
            spl_autoload_register(array('Application', 'load'));
        }
        return $this;
    }
    public static function instance() {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    //获取文件后缀
    public function getPhpExt() {
        return $this->phpExt;
    }
    //设置文件后缀
    public function setPhpExt($ext) {
        $this->phpExt = $ext;
        return $this;
    }
    //设置根路径
    public function setPath($path) {
        $this->path = rtrim(trim($path), DIRECTORY_SEPARATOR);
        return $this;
    }
    //设置自动加载的路径
    public function getLibPath() {
        return $this->path . DIRECTORY_SEPARATOR . $this->libPath;
    }
    //自动加载函数
    public static function load($class) {
        $pos = strrpos($class, '\\');
        if ($pos !== false) {
            $ns = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos + 1));
            $className = substr($class, $pos + 1);
        } else {
            $ns = DIRECTORY_SEPARATOR;
            $className = $class;
        }
        if (strpos($className, '_') !== false) {
            $className = str_replace('_', DIRECTORY_SEPARATOR, $className);
        }        
        $ins = self::instance();
        $classFile = $ins->getLibPath() . $ns . $className . $ins->getPhpExt();
        if (!(include $classFile)) {
            throw new Exception('load class failed: class=' . $class . ' file=' . $classFile);
        }
    }
}
Application::instance()->setPath(dirname(__FILE__))->setLibPath(DIRECTORY_SEPARATOR, true);
//测试,在根目录创建app目录,下面创建这两个文件
new app_user();
new \app\admin();


app目录下面的user.php

<?php
class app_user{
    public function __construct(){
        new \app\admin();
    }
}


app目录下的admin.php

<?php
namespace app;
class admin{}


1

  • 发表于 2020-04-21 13:39
  • 阅读 ( 566 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章