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


    1.使用spl_autoload_register函数注册一个自己定义的自动加载函数
    2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中
    3.兼容了两种方式,命名空间对应目录的方式 app est,类名下划线分割对应目录的方式app_test,都是对应的app目录下的test.php文件,类名要和文件名一致
    4.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 appadmin();

    app目录下面的user.php

    <?php
    class app_user{
        public function __construct(){
            new appadmin();
        }
    }

    app目录下的admin.php

    <?php
    namespace app;
    class admin{}
  • 相关阅读:
    基于Asp.Net webApi owin oauth2的实现
    动态赋值
    C#生成二维码
    深度学习中反卷积层(转置卷积)引起的棋盘格噪声
    batch normalization 批归一化 --- 一个硬币的两面
    FFMPEG常用命令-格式转换-持续更新中
    [译]CRF和QP的区别
    读懂NCHW和NHWC
    [译]GPUView
    有一次接口设计
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11431200.html
Copyright © 2020-2023  润新知