composer需要并使用非类文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了composer需要并使用非类文件相关的知识,希望对你有一定的参考价值。

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

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

答案

我不同意@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中进行)。

以上是关于composer需要并使用非类文件的主要内容,如果未能解决你的问题,请参考以下文章

Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

使用 compose 在 AndroidView 中使用片段时崩溃

Azure 机器人微软Azure Bot 编辑器系列 : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorial(代码片段

在非类帮助文件中添加 Laravel 依赖项

如何在片段内部使用Compose?

使用非类选择器选择输入类型