composer需要并使用非类文件

时间:2017-12-19 16:31:40

标签: php composer-php

我是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

或者文件可能是自动加载的,也许我可能在错误的命名空间中。如果是这种情况,我将如何调用此文件。

1 个答案:

答案 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中进行)。