zoukankan      html  css  js  c++  java
  • [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{}
  • 相关阅读:
    define和typedef
    keil5配置stm32库函数开发
    SPI、CAN、I2C
    flash,sram
    关于网络地址
    关于定时器、波特率、TH和TL值的计算
    关于串口工作方式
    ad各层
    AD快捷键
    OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11431200.html
Copyright © 2011-2022 走看看