我是Composer的新手,我无法弄清楚如何自动加载非基于类的文件。
我尝试将文件添加到composer.json中的files
数组中,然后运行composer install
,但我没有运气。
我的composer.json看起来像:
{
"name": "app",
"description": "",
"require": {
"mongodb/mongodb": "^1.2"
},
"autoload":{
"files":["src/lib/config.php"]
}
}
这是基于非类的文件config.php
$foo = "Hello";
这就是我所说的:
require_once("vendor/autoload.php");
echo $foo;
以上引发错误undefined variable: foo
。
或者文件可能是自动加载的,也许我可能在错误的命名空间中。如果是这种情况,我将如何调用此文件。
答案 0 :(得分:2)
我不同意@MarkBaker评论。实际上文件将被自动加载,但在这些文件中声明变量是不可能的。
例如,如果您在此config.php
文件中添加以下函数:
function hello()
{
echo "hello world";
}
而不是显示$foo
,您将调用此方法,如下所示:
hello();
你会得到预期的结果。
变量不可见的原因是文件通过Composer加载的方式:
function composerRequire4b299eb5732a472abef81c6ea06043af($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}
正如您所见,文件在方法中是必需的,因此所有已定义的变量仅在此方法中具有范围,因此在此之后它们将不可见(这就是PHP的工作方式)。
回答我们的问题,这是预期的行为。您不应该通过Composer在自动加载的文件中声明任何变量。如果您需要类似的功能,则应手动要求文件。
当然,我认为你不应该在配置文件中声明变量。您应该返回设置数组,然后将此数组分配给全局$config
变量(最简单的解决方案),或者使用将保存这些设置并从此类获取配置的类(例如,这样在Laravel中进行)。