Согласно многим источникам, register_globals (глобальные переменные, которые есть) должны быть отключены в вашем php.ini. Должен ли я писать define() в моем коде и использовать константы, если глобальные переменные отключены? Эти отношения даже связаны?PHP-Какая разница между глобальными переменными и константами
ответ
Они связаны тем, что они имеют глобальную область видимости, но константы не должны меняться после определения, в отличие от глобальных переменных, которые страница может изменять по мере продвижения. Поэтому просто переключиться на использование define() вместо глобального не поможет.
Лучше, если вы реорганизуете свои методы, чтобы принимать переменные в качестве параметров и полагаться на это, чтобы передавать переменные вокруг.
Константы, после определения, не могут быть изменены.
Не используйте константы в качестве переменных. Если вам нужно использовать переменные внутри функций, передайте их в саму функцию. Используйте все так, как оно предназначалось для использования. Переменные переменная и константы константа.
Несколько вещей здесь.
Во-первых, register_globals, которые вы отключили в php.ini, ссылается на старую функцию PHP, где любая переменная, отправленная через строку запроса (GET) или форму (GET/POST), будет преобразована в глобальную переменную PHP. Это функция, которая (и должна быть) отключена при отключении register_globals. Даже при этом вы можете определить глобальные переменные в своем приложении.
В общих терминах программирования глобальные переменные (а не регистры PHP-register_globals) считаются «плохими», потому что, когда вы сталкиваетесь с одним из программистов, вы не представляете, какие другие части приложения могут использовать или изменить его или какой эффект возможно, ваши изменения в этом глобальном. Кроме того, если вы определяете новую глобальную переменную, есть вероятность, что вы перепишете существующую переменную, на которую полагается кто-то другой. Когда переменные определяются локально (в одной функции или на других языках один блок), вы можете изучить локальную область и обычно определять, что будет делать изменение этой переменной.
Константы, с другой стороны, никогда не меняются. Вы определяете их один раз, и они остаются определенными, и никто не может их изменить. Вот почему глобальные константы считаются «менее плохими», чем глобальные переменные.
Константы по-прежнему плохие тогда? Должен ли я использовать сеансы для передачи таких файлов, как имена каталогов и т. Д.? – Gal
Константы не просто «менее плохие». они вполне приемлемы для использования во многих случаях, например, что Гал говорит о каталогах. – GSto
Константы в порядке, хотя вы найдете убедительные аргументы, что вы не должны использовать константы в глобальном пространстве имен (т. Е. Считались только константы класса). Здесь нет правильного ответа, только ответы с разными компромиссами. –
Глобальные переменные не являются постоянными (вы можете изменить значение глобальной переменной, но вы можете определять константу только один раз).
Константы не всегда глобальны (вы можете объявить константу в классе).
Также глобальными переменными могут быть любые типы: скаляр, массив или объект. Константы могут быть только скалярами.
Я не собираюсь говорить, что константы или глобалы хороши или плохи. При надлежащем использовании они оба имеют выгодное использование. Существуют проблемы безопасности вокруг функции register_globals
, которые отличаются от общего использования глобальных переменных.
Некоторые постоянные примеры:
<?php
// Certainly constant
define('MINUTES_PER_HOUR', 60);
define('DOZEN', 12);
// Constant, but specific to this application
define('GREETING', 'Dear %s');
define('TIMEOUT', 30);
// Configurable, but constant for this installation
define('DATABASE', 'mydb');
define('IMAGES_DIRECTORY', '/tmp/images');
// Not constant, or some other reason why can't be constant
$user = $_POST['userid'];
$days_of_week = array('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su');
?>
Попробуйте этот простой тест:
fileA.php:
<?php
define('SOMEVAL', 2);
?>
fileB.php:
<?php
if(defined('SOMEVAL')) echo SOMEVAL;
else echo "SOMEVAL does not exists\n";
include 'fileA.php';
if(defined('SOMEVAL')) echo 'SOMEVAL='.SOMEVAL;
else echo "SOMEVAL does not exists\n";
?>
Затем запустить FILEB. php, и вы увидите, что перед вами nclude fileA.php, SOMEVAL не определен. Итак, это означает, что прежде чем вы что-либо определите, сценарий не будет виден.
Что-то еще для рассмотрения - константы не могут хранить такие вещи, как массивы или объекты, тогда как что-то, определенное для $ GLOBALS, может быть любым типом переменной. Поэтому в некоторых случаях, если вам нужно что-то глобальное, но оно не может быть сохранено в константе с помощью define(), вместо этого вы можете использовать $ GLOBALS.
Кроме того, register_globals и $ GLOBALS - это не то же самое!
Вы можете изменить глобальную переменную внутри функции, если оба имеют одно и то же имя, поскольку локальная переменная переопределяет глобальную переменную, но не изменяет значение глобальной переменной outside.in constant, если вы хотите использовать переменную того же имени в разных функция, которая вам не разрешена и дает ошибку, поскольку она определяет один раз и используется во всех программах, и вы не можете изменить значение этой переменной в любой функции или заблокировать ее фиксированное значение.
Я хочу иметь некоторые предварительно заданные переменные, такие как имена каталогов, которые были бы глобальными и доступными во всем. Я также хочу, чтобы глобальные переменные были отключены. Могу ли я использовать define() в этом случае? – Gal
Если вы не намерены изменять переменную по мере выполнения страницы, то да, это правильное использование для определения. – Parrots
@Gal, да, это прекрасная причина для их использования, поскольку вы не собираетесь менять каталоги во время выполнения. – GSto