PHP -В чем разница между глобальными переменными и константами - PullRequest
7 голосов
/ 13 января 2010

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

Ответы [ 8 ]

16 голосов
/ 13 января 2010

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

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

9 голосов
/ 13 января 2010

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

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

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

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

6 голосов
/ 13 января 2010

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

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

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

Я не собираюсь говорить, что константы или глобалы хорошие или плохие. При правильном использовании они оба имеют полезное применение. В функции register_globals существуют проблемы безопасности, которые отличаются от более общего использования глобальных переменных.

2 голосов
/ 13 января 2010

Константы, однажды определенные, не могут быть изменены.

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

1 голос
/ 13 января 2010

Несколько постоянных примеров:

<?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');

?>
0 голосов
/ 22 февраля 2017

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

0 голосов
/ 16 сентября 2010

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

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

0 голосов
/ 13 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...