2010-01-13 3 views
7

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

ответ

15

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

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

+0

Я хочу иметь некоторые предварительно заданные переменные, такие как имена каталогов, которые были бы глобальными и доступными во всем. Я также хочу, чтобы глобальные переменные были отключены. Могу ли я использовать define() в этом случае? – Gal

+1

Если вы не намерены изменять переменную по мере выполнения страницы, то да, это правильное использование для определения. – Parrots

+4

@Gal, да, это прекрасная причина для их использования, поскольку вы не собираетесь менять каталоги во время выполнения. – GSto

2

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

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

+0

Я хочу использовать константы, чтобы иметь возможность передавать имена каталогов. – Gal

+0

Если значение каталога не будет изменено, то обязательно используйте константу :) – Sampson

8

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

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

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

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

+0

Константы по-прежнему плохие тогда? Должен ли я использовать сеансы для передачи таких файлов, как имена каталогов и т. Д.? – Gal

+0

Константы не просто «менее плохие». они вполне приемлемы для использования во многих случаях, например, что Гал говорит о каталогах. – GSto

+0

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

6

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

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

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

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

1

Некоторые постоянные примеры:

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

?> 
-1

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

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

0

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

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

0

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