У меня есть веб-приложение, построенное на PHP 5.5. К нему было добавлено новое приложение (в подкаталоге), построенное на Slim Framework v3.
Приложение работает в среде, в которой любой PHP-скрипт, который выполняется, имеет файл config.php
, автоматически включаемый с помощью директивы auto_prepend_file
в php.ini.
Насколько я понимаю, это эквивалентно наличию следующего во всех скриптах, но без необходимости каждый раз вручную писать 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, но мне было интересно, знает ли кто-нибудь, почему это так и как это исправить?
1 ответ
PHP
документация по областям действия переменных гласит: "Для По большей части, все переменные PHP имеют только одну область видимости. Эта единая область охватывает как включенные, так и необходимые файлы. ... внутри пользовательских функций вводится локальная область действия. Любая переменная, используемая внутри функции, по умолчанию ограничена локальным объем функции ".
Похоже, что ваши «сценарии PHP, не являющиеся частью Slim-приложения» используют данные из config.php
только из кода в глобальной области видимости, то есть из кода, который не находится внутри метода или функции. Таким образом, он видит как константы PHP
, так и переменные из config.php
, которые также находятся в глобальной области видимости.
Код, использующий фреймворки, такие как Slim Framework
, обычно находится в каком-либо методе обратного вызова или функции, которая вызывается кодом фреймворка (т.е. он находится в локальной области). Таким образом, ваш код видит константы глобальной области PHP
(которые видны из локальной области), но не видит переменные глобальной области PHP
(которые заменяются вновь созданными пустыми переменными локальной области с такими же именами. ).
Чтобы использовать их, вы можете объявить их перед использованием с ключевым словом global
, например:
...
global $ASSETS_VER;
echo $ASSETS_VER;
...
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
phpinfo
на любой из страниц в Slim Framework, отображаются ли те жеPHP.ini
иauto_prepend_file
в списке?