资讯专栏INFORMATION COLUMN

php微框架 flight源码阅读——1.自动加载

OnlyLing / 2054人阅读

摘要:先来看下框架的单入口文件,先引入了框架类文件。中定义了加载存放哪些类型类路径数组对象数组框架目录路径数组中使用将当前类中的方法注册为加载的执行方法。接下来我们试着按照自动加载的方式,写个简单的自动加载进行测试微框架源码阅读系列

先来看下框架的单入口文件index.php,先引入了Flight.php框架类文件。


Flight.php中定义了Flight类,类里面先定义了3个魔术方法,这三个魔术方法是为了防止当前类被实例化

// Don"t allow object instantiation
private function __construct() {}
private function __destruct() {}
private function __clone() {}

如果试着去new Flight会提示如下错误:

Fatal error: Uncaught Error: Call to private Flight::__construct() from invalid context in /usr/local/var/www/flight135/index.php:3 Stack trace: #0 {main} Next Error: Call to private Flight::__destruct() from context "" in /usr/local/var/www/flight135/index.php:3 Stack trace: #0 {main} thrown in /usr/local/var/www/flight135/index.php on line 3

接着定义了一个重载方法__callStatic(),在index.php中执行Flight::route("/", "hello")就会调用该__callStatic,其中$name就是"route"$params就是自己写的hello函数。在__callStatic()中调用了当前类的app()静态方法,这里为什么不使用self::app()来调用呢?

/**
 * Handles calls to static methods.
 *
 * @param string $name Method name
 * @param array $params Method parameters
 * @return mixed Callback results
 * @throws Exception
 */
public static function __callStatic($name, $params) {
    $app = Flight::app();
    return flightcoreDispatcher::invokeMethod(array($app, $name), $params);
}

接着就是在static app()中开始处理自动加载了

/**
 * @return flightEngine Application instance
 */
public static function app() {
    static $initialized = false;
    if (!$initialized) {
        require_once __DIR__."/autoload.php";
        self::$engine = new flightEngine();
        $initialized = true;
    }
    return self::$engine;
}

进入到autoload.php来看,引入了core目录下的Loader.php类文件,Loader就是加载器。

autoload.php
require_once __DIR__."/core/Loader.php";
flightcoreLoader::autoload(true, dirname(__DIR__));

Loader中定义了加载存放哪些类型:$classes(类路径数组),$instances(对象数组),$dirs(框架目录路径数组)

/**
 * Registered classes.
 *
 * @var array
 */
protected $classes = array();
/**
 * Class instances.
 *
 * @var array
 */
protected $instances = array();
/**
 * Autoload directories.
 *
 * @var array
 */
protected static $dirs = array();

autoload()中使用spl_autoload_register将当前类(__CLASS__)中的loadClass方法注册为加载的执行方法。

/**
 * Starts/stops autoloader.
 *
 * @param bool $enabled Enable/disable autoloading
 * @param array $dirs Autoload directories
 */
public static function autoload($enabled = true, $dirs = array()) {
    if ($enabled) {
        spl_autoload_register(array(__CLASS__, "loadClass"));
    }
    else {
        spl_autoload_unregister(array(__CLASS__, "loadClass"));
    }
    if (!empty($dirs)) {
        self::addDirectory($dirs);
    }
}

/**
 * Autoloads classes.
 *
 * @param string $class Class name
 */
public static function loadClass($class) {
    $class_file = str_replace(array("", "_"), "/", $class).".php";
    foreach (self::$dirs as $dir) {
        $file = $dir."/".$class_file;
        if (file_exists($file)) {
            require $file;
            return;
        }
    }
}

接下来我们试着按照flight自动加载的方式,写个简单的自动加载进行测试:


/autoload/index.php

 string(36) "/usr/local/var/www/autoload/Test.php" [1]=> string(37) "/usr/local/var/www/autoload/Test2.php" } 

/autoload/Loader.php



/autoload/Test.php



/autoload/Test2.php



php微框架 flight源码阅读系列

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29081.html

相关文章

  • php框架 flight源码阅读

    摘要:是一个可扩展的微框架,快速简单,能够快速轻松地构建应用程序,在上有。框架代码十分精简,在几分钟内你就可以看完整个框架源码,使用起来也是很简单优雅。目录微框架源码阅读自动加载微框架源码阅读框架初始化微框架源码阅读路由实现及执行过程 Flight https://github.com/mikecao/fl...是一个可扩展的PHP微框架,快速、简单,能够快速轻松地构建RESTful web...

    CntChen 评论0 收藏0
  • php框架 flight源码阅读——2.框架初始化、Loader、Dispatcher

    摘要:当调用时,会触发当前类的魔术方法,通过判断属性中索引是否存在,不存在抛出异常,存在就通过去实例化初始化时设置的,这里是工厂模式,接下来的路由文章会详细分析。在操作中,会将前置操作设置到类的属性中。微框架源码阅读系列 在自动加载实现完成后,接着new flightEngine()自动加载的方式实例化了下框架的核心类Engine,这个类名翻译过来就是引擎发动机的意思,是flight的引擎发...

    U2FsdGVkX1x 评论0 收藏0
  • php框架 flight源码阅读——3.路由Router实现及执行过程

    摘要:当然在对象中也没有方法,于是会触发当前对象中的魔术方法。获取对象获取对象获取对象设置方法执行的后置操作现在来看操作都做了什么。匹配的部分对路由匹配实现正则匹配微框架源码阅读系列 现在来分析路由实现及执行过程,在项目目录下创建index.php,使用文档中的路由例子(含有路由规则匹配),如下:

    王晗 评论0 收藏0
  • laravel入门

    摘要:开发根目录测试分为单元测试和功能测试创建一个文件执行测试测试前清除配置缓存运行单个测试用例小提示在开发与进行交互的第三方扩展包时,最好选择注入契约而不使用。 参考https://laravelacademy.org/ 概念 单词 契约Contract 就是接口 repository 仓库(封装数据访问,可以搜索:repository模式) Container 容器 ServicePr...

    韩冰 评论0 收藏0
  • 你不可不知道的20个优秀PHP框架

    摘要:每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷安全和有效。官方网站是一款老牌的框架,现在稳定版本已经是了。官方网站是由最大的社区之一的管理开发的,也是一个开源的框架。 对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言。世界上很多顶级的网站都是基于PHP开发的。 每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷、安全和有效。在开发项目之前选...

    zombieda 评论0 收藏0

发表评论

0条评论

OnlyLing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<