我有一个用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的工作原理有关,但是想知道是否有人知道为什么会这样,以及如何解决它?
答案 0 :(得分:1)
PHP
文档on variables scopes读取:&#34;在大多数情况下,所有PHP变量只有一个范围。此单一范围也涵盖包含和所需文件。 ...在用户定义的函数中引入了本地函数范围。函数内使用的任何变量默认都限制在本地函数范围内。&#34;
您的&#34; PHP脚本似乎不是Slim应用程序的一部分&#34;仅使用来自全局范围内的代码的config.php
中的数据,即来自不位于方法或函数内的代码。因此,它看到来自PHP
的{{1}}常量和变量也属于全局范围。
使用框架的代码,例如config.php
通常位于由框架代码调用的某种回调方法或函数中(即它在本地范围内)。因此,您的代码会看到全局范围Slim Framework
常量(从本地范围可见),但是没有看到全局范围PHP
变量(由新创建的本地范围空变量替换)同名)。
为了使用它们,您可以在使用关键字PHP
之前声明它们,如下所示:
global