Yii2扩展的第三方自动(auto_load)加载解析

Yii2是非常流行的开源php框架,在CMS框架中的性能测试中表现最优,目前被很多的中小企业用来开发企业网站和博客系统,甚至中小型的电商系统,是网站开发的一个利器。 

Yii2的入门门槛不是很容易,本文将介绍一下Yii2的自动加载。 

Yii2的自动加载依赖于php的spl_autoload_register函数,如果对于Yii2的自动加载机制不太熟悉的朋友可以参考下面的http://www.digpage.com/autoload.html。

这里我大概滴总结一下,代码引入在在web/index.php下面

 

“require(__DIR__ . '/../../vendor/autoload.php');

require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

 

第一行代码是第三方扩展的autoload,第二行是Yii2的基础类的autoload,但是请注意 Yii::php的写法 spl_autoload_register(['Yii', 'autoload'], true, true); 因为其中的参数为true,所以Yii基础类的autoload的加载要早于第三方的加载顺序。 

本文的的重点在于第三方的自动加载。

使用composer来管理扩展包有个不好的特点就是所有的require的组件可能同时都会被更新并且程序员无法知道具体某个包更新了什么内容,对于live来说这种风险非常大。我们需要一种更加可控性的方法来更新我们的包。 个人而言,我更加喜欢使用git的命令来更新软件包,很容易知道更新的具体内容,并且回滚方便,而且更新的速度非常。 

假如我现在使用git clone的方式直接在vendor下下载了一个扩展,拿 chocoboxxf/yii2-qiniu-sdk来做过列子,它的composer.json如下, 

{

  "name": "chocoboxxf/yii2-qiniu-sdk",

  "type": "yii2-extension",

  "description": "Qiniu API for Yii 2.0",

  "keywords": ["yii2", "qiniu", "upload", "sdk"],

  "homepage": "https://github.com/chocoboxxf/yii2-qiniu-sdk",

  "license": "MIT",

  "support": {

    "issues": "https://github.com/chocoboxxf/yii2-qiniu-sdk/issues",

    "wiki": "https://github.com/chocoboxxf/yii2-qiniu-sdk/wiki",

    "source": "https://github.com/chocoboxxf/yii2-qiniu-sdk"

  },

  "authors": [

    {

      "name": "chocoboxxf",

      "email": "neil.xuxf@gmail.com",

      "homepage": "https://github.com/chocoboxxf",

      "role": "Developer"

    }

  ],

  "require": {

    "php": ">=5.4.0",

    "yiisoft/yii2": "*",

    "qiniu/php-sdk": "v7.0.5"

  },

  "require-dev": {

    "phpunit/phpunit": ">=4.0"

  },

  "autoload": {

    "psr-4": {

      "chocoboxxf\\Qiniu\\": "src/"

    }

  },

  "autoload-dev": {

    "psr-4": {

      "chocoboxxf\\Qiniu\\Tests\\": "tests/"

    }

  }

},可以看到这个扩展依赖  "qiniu/php-sdk": “v7.0.5”,继续clone     "qiniu/php-sdk": “v7.0.5”, 下载可以看到它的composer.json是这样的

”{

    "name": "qiniu/php-sdk",

    "type": "library",

    "description": "Qiniu Resource (Cloud) Storage SDK for PHP",

    "keywords": ["qiniu", "storage", "sdk", "cloud"],

    "homepage": "http://developer.qiniu.com/",

    "license": "MIT",

    "authors": [

        {

            "name": "Qiniu",

            "email": "sdk@qiniu.com",

            "homepage": "http://www.qiniu.com"

        }

    ],

    "require": {

        "php": ">=5.3.3"

    },

    "require-dev": {

        "phpunit/phpunit": "~4.0",

        "squizlabs/php_codesniffer": "~2.3"

    },

    "autoload": {

        "psr-4": {"Qiniu\\": "src/Qiniu"},

        "files": ["src/Qiniu/functions.php"]

    }

}

 

拿 "autoload": {

        "psr-4": {"Qiniu\\": "src/Qiniu"},

        "files": ["src/Qiniu/functions.php"]

    }

这一段来看,里面有2个东西需要做自动加载的, 是src/Qiniu和functions.php, 下面会解释一下如果使用composer来加载的话它做了一些什么事情。 

回到开头,第三方的自动加载是通过vendor/autoload.php来做的, 该文件require /composer/autoload_real.php,创建了一个ClassLoader.php的类,它是composer的一个核心类, 打开vendor/composer目录,还会看到一些php的类。这些文件都是composer来修改的,如果我们使用git clone的方式来管理包,只要手动修改一下就行了。 

和Qiniu组件相关的是三个文件, 

1.autoload_psr4.php,增加下面的行

    'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu'),

2.autoload_file.php 增加

    '841780ea2e1d6545ea3a253239d59c05' => $vendorDir . ‘/qiniu/php-sdk/src/Qiniu/functions.php',

其中2)是自动加载的文件,非类,函数而已。

3.autoloaded_static.php内有静态变量的定义, $files和$prefixLengthsPsr4(它是以首字母为索引的数组)

除了修改composer下的几个文件,最后不要忘记了需要在yiisoft/extensions.php增加2个alias的定义, 

  'chocoboxxf/yii2-qiniu-sdk' => 

  array (

    'name' => 'chocoboxxf/yii2-qiniu-sdk',

    'version' => '9999999-dev',

    'alias' => 

    array (

      '@chocoboxxf/Qiniu' => $vendorDir . '/chocoboxxf/yii2-qiniu-sdk/src',

    ),

  ),

  'qiniu/php-sdk' => 

  array (

    'name' => 'qiniu/php-sdk',

    'version' => '9999999-dev',

    'alias' => 

    array (

      '@Qiniu' => $vendorDir . '/qiniu/php-sdk/src/Qiniu',

    ),

  ),

 

框架的方便之处是给网站制作带来了很多的便利,但是如果程序员不深入地研究,遇到一些复杂的问题就难以招架了。希望本文能够给读者带来一些帮助。 

相关阅读

网站制作

作者 :英国中软软件

网站: 英国中软软件官网

条评论

我要评论

所有带星号(*)输入框都需要填写.不允许有任何的HTML代码

提交