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

时间:2017-01-06 15:46:42

标签: php slim

我有一个用PHP 5.5构建的Web应用程序。添加了一个新的应用程序(在子目录中),该应用程序是在Slim Framework v3中构建的。

应用程序在一个环境中运行,其中所执行的任何 PHP脚本都有一个文件config.php,该文件使用php.ini中的auto_prepend_file指令自动包含。

这相当于在所有脚本中包含以下内容,据我所知,但不需要每次都手动编写require_once 'config.php'

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

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

每当我们运行不属于Slim应用程序的PHP脚本时, 可以读取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的工作原理有关,但是想知道是否有人知道为什么会这样,以及如何解决它?

1 个答案:

答案 0 :(得分:1)

PHP文档on variables scopes读取:&#34;在大多数情况下,所有PHP变量只有一个范围。此单一范围也涵盖包含和所需文件。 ...在用户定义的函数中引入了本地函数范围。函数内使用的任何变量默认都限制在本地函数范围内。&#34;

您的&#34; PHP脚本似乎不是Slim应用程序的一部分&#34;仅使用来自全局范围内的代码的config.php中的数据,即来自不位于方法或函数内的代码。因此,它看到来自PHP的{​​{1}}常量和变量也属于全局范围。

使用框架的代码,例如config.php通常位于由框架代码调用的某种回调方法或函数中(即它在本地范围内)。因此,您的代码会看到全局范围Slim Framework常量(从本地范围可见),但是没有看到全局范围PHP变量(由新创建的本地范围空变量替换)同名)。

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

global