composer需要并使用非类文件

问题描述 投票:0回答:1

我是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的错误。

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

php composer-php
1个回答
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中进行)。

© www.soinside.com 2019 - 2024. All rights reserved.