我是作曲家的新手,这是我的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
?
答案 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();