PHP-в чем разница между глобальными переменными и константами

согласно многим источникам, register_globals (глобальные переменные) должны быть отключены в вашем php.ini. должен ли я писать define () в моем коде и использовать константы, если глобальные переменные отключены? те хоть как-то связано?

8 ответов


Они связаны тем, что они имеют глобальную область, но константы не должны изменяться после определения, в отличие от глобальных переменных, которые страница может изменять по мере продвижения. Поэтому простое переключение на использование define () вместо global не очень поможет.

будет лучше, если вы рефакторинг свои методы взять переменные в качестве параметров, и рассчитывать на то, что для передачи переменных вокруг.


несколько вещей здесь.

во-первых, register_globals, которые вы отключаете в своем php.ini ссылается на старую функцию PHP, где любая переменная, отправленная через строку запроса (GET) или форму (GET/POST), будет преобразована в глобальную переменную PHP. Это функциональность, которая отключается (и должна быть отключена) при выключении register_globals. Даже если это выключено, вы все равно можете определить глобальные переменные в своем приложении.

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

константы, с другой стороны, никогда не меняются. Вы определяете их один раз, и они остаются определенными, и никто не может их изменить. Вот почему наличие глобальных констант считается "менее плохим", чем наличие глобальных переменных.


глобальные переменные не являются постоянными (вы можете изменить значение глобальной переменной, но вы можете только определить константу).

константы не всегда глобальные (вы можете объявить константу в классе).

кроме того, глобальные переменные могут быть любого типа: скаляр, массив или объект. Константы могут быть только скалярами.

Я не собираюсь говорить, что константы или глобалы хороши или плохи. При надлежащем использовании они оба имеют полезное применение. Есть проблемы безопасности вокруг 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');

?>

что-то еще рассмотреть -- константы не могут хранить такие вещи, как массивы или объекты, тогда как что-то определенное в $GLOBALS может быть любым типом переменной. Поэтому в некоторых случаях, если вам нужно что-то глобальное, но оно не может быть сохранено в константе с помощью define (), вы можете использовать $GLOBALS.

кроме того, register_globals и $GLOBALS-это не одно и то же!


вы можете изменить глобальную переменную внутри функции, если оба имеют одинаковое имя, потому что локальная переменная переопределяет глобальную переменную, но не изменяет значение глобальной переменной снаружи.в константе, если вы хотите использовать одно и то же имя переменной в другой функции,что не разрешено вам и дать ошибку, потому что он определяет один раз и используется во всей программе, и вы не можете изменить значение этой переменной в любой функции или блоке это фиксированное значение .


попробуйте этот простой тест:

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, и вы увидите это, прежде чем включать fileA.php, SOMEVAL не определен. Таким образом, это означает, что перед определением чего-либо он не будет виден скрипту.