У меня есть веб-приложение, построенное на 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
Andy 6 Янв 2017 в 18:46
2
Вы устанавливаете глобальные переменные и пытаетесь получить к ним доступ в функции или методе?
 – 
Maerlyn
6 Янв 2017 в 19:05
Если вы запускаете phpinfo на любой из страниц в Slim Framework, отображаются ли те же PHP.ini и auto_prepend_file в списке?
 – 
John Joseph
6 Янв 2017 в 19:13
1
Думаю, дело в объеме вашей переменной. Константы в глобальной области видимости также являются глобальными, а переменные - нет. Если вы его не определите.
 – 
Gabriel Heming
6 Янв 2017 в 19:21
Хорошо, это действительно связано с объемом переменных. Итак, есть ли какие-нибудь практические методы для передачи тех, что находятся в config.php, в мои классы Slim?
 – 
Andy
6 Янв 2017 в 19:42

1 ответ

Лучший ответ

PHP документация по областям действия переменных гласит: "Для По большей части, все переменные PHP имеют только одну область видимости. Эта единая область охватывает как включенные, так и необходимые файлы. ... внутри пользовательских функций вводится локальная область действия. Любая переменная, используемая внутри функции, по умолчанию ограничена локальным объем функции ".

Похоже, что ваши «сценарии PHP, не являющиеся частью Slim-приложения» используют данные из config.php только из кода в глобальной области видимости, то есть из кода, который не находится внутри метода или функции. Таким образом, он видит как константы PHP, так и переменные из config.php, которые также находятся в глобальной области видимости.

Код, использующий фреймворки, такие как Slim Framework, обычно находится в каком-либо методе обратного вызова или функции, которая вызывается кодом фреймворка (т.е. он находится в локальной области). Таким образом, ваш код видит константы глобальной области PHP (которые видны из локальной области), но не видит переменные глобальной области PHP (которые заменяются вновь созданными пустыми переменными локальной области с такими же именами. ).

Чтобы использовать их, вы можете объявить их перед использованием с ключевым словом global, например:

...
global $ASSETS_VER;
echo $ASSETS_VER;
...
1
SergeyLebedev 9 Янв 2017 в 12:31