专栏首页陶士涵的菜地[PHP] 项目实践中的自动加载实现

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

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

app目录下面的user.php

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

app目录下的admin.php

<?php
namespace app;
class admin{}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PHP] 读取大文件并显示

    使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据

    陶士涵
  • [Laravel] Laravel的基本使用

    使用Laravel的基本路由,实现get请求响应,找到文件app/Http/routes.php

    陶士涵
  • [javascript] vue的实例生命周期钩子函数

    当有一个页面在第一次进入渲染时 , 请求一个接口 , 该接口获取完数据后, 展示到界面上, 用到了created这个钩子函数 created函数将在vue实例创...

    陶士涵
  • 使用reactJS要注意的地方

    虽然react使用的jsx可以html和js混编,但是这里的html用的时候有的地方还是和原来的习惯不太一样。这里汇总一些我已经遇到的不一样,还有其他要注意的地...

    黒之染
  • React Native ios开发第一课

    前言 本篇文章的作用在于帮助你快速上手使用React Native编写iOS应用。如果你现在还不太了解React Native是什么以及Facebook为什么...

    xiangzhihong
  • React.js 实战之 事件处理

    React事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) ...

    JavaEdge
  • Canvas 进阶(三)ts + canvas 重写”辨色“小游戏

    之前写过一篇文章 ES6 手写一个“辨色”小游戏, 感觉好玩挺不错。岂料评论区大神频出,其中有人指出,打开控制台,输入以下代码:

    小皮咖
  • Tencent Xcheck代码安全检测:ThinkAdmin远程代码执行漏洞预警

    Xcheck是腾讯自研的静态应用安全测试(SAST,Static application security testing)工具。现已支持Python、Node...

    Deen_
  • Laravel+Vue 构建支持邮件通知的二级评论系统

    这篇文章严格来讲是将已有的仿简书二级评论系统和 Laravel、Vue 进行结合并改进,例如添加邮件通知,评论定位。前人栽树后人乘凉,评论系统的数据结构和 Vu...

    蓝默空间
  • React常见的15个问题

    在 jsComplete,我们管理一个专门用于帮助编程学习者 slack 帐户。我们常常会收到一些有趣的问题,但大多数问题都是常见问题。 我创建这个资源为了帮助...

    Fundebug

扫码关注云+社区

领取腾讯云代金券