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;
...
我有一个内置于 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;
...