其他文件无法访问Composer自动加载文件变量

时间:2018-03-22 04:45:18

标签: php variables composer-php autoload

我是作曲家的新手,这是我的composer.json文件:

{
    "name": "asd",
    "authors": [
        {
            "name": "test",
            "email": "test@me.com"
        }
    ],
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "files": [
            "config/bootstrap.php",
            "lib/app.php"
        ],
        "classmap": [
            "lib/ez_sql/shared/ez_sql_core.php",
            "lib/ez_sql/mysql/ez_sql_mysql.php",
            "lib/smarty/libs/"
        ],
        "psr-4": {
            "App\\" : "app/",
            "Sys\\": "system/"
        }
    }
}

正如您所看到的,有一个自动加载文件config/bootstrap.php,其中我有几个类实例,我想在其他文件中访问这些文件。但问题是我无法访问,直到我没有声明为GLOBAL变量。例如:

配置/ bootstrap.php中

$obj1 = new obj();
$GLOBALS['obj2'] = new obj2();

我可以访问$obj2等其他文件中的index.php,但无法使用$obj1

是否有其他可能的方法在其他文件中使用composer autoload文件变量而不是声明为global

1 个答案:

答案 0 :(得分:1)

Composer 在函数内自动加载(参见 vendor/composer/autoload_real.php:composerRequireXXX() 中的 require 语句)。它的预期用途是用于仅包含函数和类而不是变量的文件。因为函数和类总是附加到全局作用域,所以这些符号在 getLoader 函数退出后就存在了。但是,默认情况下变量不是全局作用域,因此在 getLoader 返回时会丢失。

您认为必须将这些变量定义为全局变量是正确的,这样它们才能在 Composer 的范围自动加载中存活下来。

您可以通过以下任一方式更改 config/bootstrap.php 以通过 Composer 的自动加载文件功能全局访问 $obj1

 $obj1 = new obj();
+$GLOBALS['obj1'] = $obj1;
 $GLOBALS['obj2'] = new obj2();

或使用 global 关键字:

+global $obj1;
 $obj1 = new obj();
 $GLOBALS['obj2'] = new obj2();