PHP php.ini auto_prepend_file 中的变量在 Slim Framework 中不可读 class

PHP variables in php.ini auto_prepend_file are not readable in Slim Framework class

我有一个内置于 PHP 5.5 中的 Web 应用程序。一个新的应用程序已经添加到它(在一个子目录中),它是在 Slim Framework v3 中构建的。

应用程序 运行 正在执行的 任何 PHP 脚本的环境中自动包含一个文件 config.php在 php.ini 中使用 <a href="http://php.net/manual/en/ini.core.php#ini.auto-prepend-file" rel="nofollow noreferrer">auto_prepend_file</a> 指令。

据我了解,这相当于在所有脚本中都有以下内容,但无需每次都手动编写require_once 'config.php'

<?php
    require_once 'config.php';
    // Script starts here
?>

config.php 包含一些配置设置;其中一些是使用 PHP 的 define 方法设置的,(例如 define('FOO', 'bar')),其他是正常的 PHP 变量(例如 $ASSETS_VER = '1.0');

每当我们 运行 PHP 脚本 不是 Slim 应用程序的一部分时 所有 变量在config.php可以读到。例如...

<?php
// myscript.php
echo FOO;
echo $ASSETS_VER;
?>

...将输出配置文件中的任何内容(分别为'bar' 和'1.0')。

问题

然而,在使用 Slim Framework 的应用程序部分 - 我们只能从 config.php 中读取使用 define() 设置的内容,而常规变量是未定义的。所以在上面的例子中 echo FOO 会产生 'bar' 而 echo $ASSETS_VER 不会产生任何东西。

我不确定这是否与 Slim Framework 的工作方式有关,但想知道是否有人知道为什么会这样,以及如何解决它?

PHP 文档 on variables scopes 内容为:"For the most part all PHP variables only have a single scope. This single scope spans included and required files as well. ... within user-defined functions a local function scope is introduced. Any variable used inside a function is by default limited to the local function scope."

似乎您的 "PHP scripts that are not part of the Slim application" 使用来自 config.php 的数据仅来自全局范围内的代码,即来自不位于方法或函数内部的代码。所以它看到 PHP 常量和来自 config.php 的变量也在全局范围内。

使用框架的代码,例如Slim Framework通常位于框架代码调用的某种回调方法或函数中(即在本地范围内)。所以你的代码看到全局范围 PHP 常量(从本地范围可见),但看不到全局范围 PHP 变量(被新创建的具有相同名称的本地范围空变量替换).

为了使用它们,您可以在使用关键字 global 之前声明它们,如下所示:

...
global $ASSETS_VER;
echo $ASSETS_VER;
...