Пришлось подробно изучить вопрос откуда в Битриксе «неожиданно» возникают глобальные переменные. В некоторых случаях между $CODE и $_REQUEST["CODE"] нет разницы.
Странно? Почему $CODE содержит значение? Первая мысль: «настройка register_globals включена». Но на виртуальной машине и на хостинге она выключена. Тем более известно, что эта опция потенциально опасна при неправильном использовании и даже удалена в версии php 5.4.0.
После длительного исследования была найдена функция, которая вызывается при подключении заголовка /bitrix/header.php:
На странице /index.php любая используемая переменная будет глобальной. $GLOBALS или global писать не надо.
Внутри функций своё изолированное пространство имен, и к глобальной переменной можно обращаться через массив $GLOBALS или ключевое слово global.
<?// index.php
// Пример 1. Установка глобальной переменной до функции
function ShowGlobalValue()
{
echo $GLOBALS["value"];
}
$value = 1;
ShowGlobalValue(); // покажет 1
?>
<?// index.php
// Пример 2. Установка глобальной переменной внутри функции
function SetGlobalValue()
{
$GLOBALS["value"] = "1";
}
SetGlobalValue();
echo $value; // покажет 1
?>
Фрагмент функции FormDecode() делает из переменной $_GET["CODE"] глобальную переменную $CODE. Поэтому /index.php?CODE=Artemy всегда создает переменную $CODE=Artemy:
foreach($_GET as $key => $val)
if(!isset($superglobals[$key]))
$GLOBALS[$key] = $val;
Аналогично из $_SERVER["DOCUMENT_ROOT"] получается глобальная переменная $DOCUMENT_ROOT.
Выводы:
Несмотря на то, что сейчас везде PHP 5.3 и PHP 5.4, в Битриксе эмулируется register_globals=on. Это означает, что переменные перед использованием на странице надо объявлять. Иначе они могут быть неожиданно получены из URL.
Компонент вызывается функцией $APPLICATION->IncludeComponent(), значит в нем пространство имен изолировано.
Включаемый файл вызывается функцией $APPLICATION->IncludeFile(). В нем тоже пространство имен изолировано.
Настоятельно не рекомендуется писать код на странице. Пишите код внутри компонентов, или во включаемых файлах, или в функциях.
На странице можно писать короче $CODE вместо $_REQUEST["CODE"]. Но лучше $_REQUEST["CODE"], потому что такой код при копировании в другое место не вызовет странных ошибок.
Прятать смысла нет - любой может посмотреть Давайте и это тоже будем прятать — http://pastebin.com/HMgz89hACCalendarSceleton::Build сильно был раздосадован таким подходом, но запостить на хабр рука не поднялась. MVC и HTML в ядре. Ок.
А 12 тестить придётся много. Сергей говорил, что они думают над тем, а не отдать ли её сначала NFR -версиям.
@bitrixinsider постараемся сначала для NFR партнеров. Но будет видно.
@Антон Долганин, не бойся. register_globals - это всего лишь стиль кодирования. Для грамотного разработчика не проблема. Тем более, если ты всегда писал, как будто register_globals выключен, то весь код будет работать, так же если register_globals включен.
Битрикс за нас всё продумал. В публичке, где одни компоненты, наговнокодить сложно.
В админке иначе. Переменные часто используются без объявления. На страницах options есть $Update, $Apply и $RestoreDefaults, но ничего страшного нет:
Александр , нет, нельзя. К этому надо привыкнуть, и это вообще не так страшно. Главное - знать, что на странице переменные нужно обязательно инициализировать. А внутри функций всё хорошо.
А можете подсказать, у меня после переезда на VDS, ошибки периодически валятся такие:
Notice: Undefined variable: _SERVER in /home/www/about/howto/index.php on line 2
Warning: require(/bitrix/header.php): failed to open stream: No such file or directory in /home/www/about/howto/index.php on line 2
Fatal error: require(): Failed opening required '/bitrix/header.php' (include_path='.:/usr/share/pear:/usr/share/php') in /home/www/about/howto/index.php on line 2
Лечится ребутом php-fpm. Копаю неделю, пока не смог понять в чем беда.
Вам надо понять, что не так с $_SERVER["DOCUMENT_ROOT"] и переменой $_SERVER у вас на сервере. Любой хостинг должен её поддерживать. И искать надо в настройках хостинга.
Спасибо за уточнение. В bitrix:catalog и не должно работать из-за особенности компонента. Если вы используете комплексный компонент, то фильтр нужно задавать внутри шаблона компонента bitrix:catalog, после вызова компонента catalog.smart.filter, но перед catalog.section.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».