各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

php微框架中flight源码的自动加载的解析

管理员 2023-09-05
PHP
159

php微框架中flight源码的自动加载的解析

内容导读

收集整理的这篇技术教程文章主要介绍了php微框架中flight源码的自动加载的解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4563字,纯文字阅读大概需要7分钟

内容图文

这篇文章给大家分享的内容是关于php微框架中flight源码的自动加载的解析,有一定的参考价值,有需要的朋友可以参考一下。

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

<?phprequire 'flight/Flight.php';Flight::route('/', function(){    echo 'hello world!';});Flight::start();

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

// Don't allow object instantiationprivate 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.phprequire_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<?phpclass MyClass{    public static function __callStatic($name, $params){        self::app();    }    public static function app(){        require_once __DIR__.'/Loader.php';        Loader::autoload(true, dirname(__DIR__));        new autoloadTest();    }}MyClass::test();new autoloadTest2();var_dump(Loader::getClasses());//array(2) { [0]=> string(36) "/usr/local/var/www/autoload/Test.php" [1]=> string(37) "/usr/local/var/www/autoload/Test2.php" } /autoload/Loader.php<?phpclass Loader {    public static $dirs = [];    public static $classes = [];    public static function autoload($enabled=true, $dirs=[]) {        if ($enabled) {            spl_autoload_register([__CLASS__, 'loadClass']);        } else {            spl_autoload_unregister([__CLASS__, 'loadClass']);        }                if (!empty($dirs)) {            self::addDirectory($dirs);        }    }    public static function loadClass($class) {        $class_file = str_replace(['\', '_'], '/', $class).'.php';                foreach (self::$dirs as $dir) {            $file = $dir.'/'.$class_file;                        if (file_exists($file)) {                require $file;                self::$classes[] = $file;                                return;            }        }    }    public static function addDirectory($dir) {        if (is_array($dir) || is_object($dir)) {            foreach ($dir as $value) {                self::addDirectory($value);            }        }        else if (is_string($dir)) {            if (!in_array($dir, self::$dirs)) self::$dirs[] = $dir;        }    }    public static function getClasses(){        return self::$classes;    }}/autoload/Test.php<?phpnamespace autoload;class Test {}/autoload/Test2.php<?phpnamespace autoload;class Test2 {}

x相关推荐:

GoFrame框架的gtime模块和自定义时间格式化语法的分析

Swoft源码之Swoole和Swoft的分析

以上就是php微框架中flight源码的自动加载的解析的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php微框架中flight源码的自动加载的解析全部内容,希望文章能够帮你解决php微框架中flight源码的自动加载的解析所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部