Насколько эффективно определяется PHP?

Препроцессор С++ #define полностью отличается.

Является ли PHP define() чем-то другим, чем просто создание var?

define("SETTING", 0);  
$something = SETTING;

против

$setting = 0;  
$something = $setting;

Ответ 1

'define' сама операция довольно медленная - подтверждается профилировщиком xdebug.

Ниже приведены эталоны http://t3.dotgnu.info/blog/php/my-first-php-extension.html:

  • pure 'define'
    380.785 выборки/сек
    14.2647 означает msecs/first-response

  • константы, определенные с расширением 'hidef'
    930,783 выборки/сек
    6.30279 среднее значение msecs/first-response


обновленная ссылка

Сообщение в блоге, упомянутое выше, покинуло интернет. Его можно просмотреть здесь через Wayback Machine. Вот еще одна аналогичная статья.

Библиотеки ссылок автора можно найти здесь (apc_define_constants) и здесь (hidef extension).

Ответ 2

В общем, идея константы должна быть постоянной (звучит смешно, правильно?;)) внутри вашей программы. Это означает, что компилятор (интерпретатор) заменит "FOOBAR" значением FOOBAR на протяжении всего вашего script.

Так много для теории и преимуществ - если вы скомпилируете. Теперь PHP довольно динамичен, и в большинстве случаев вы не заметите другого, потому что PHP script скомпилирован с каждым прогоном. Afai-can-tell вы не должны видеть заметную разницу в скорости между константами и переменными, если вы не используете кеш-код, например APC, Zend Optimizer или eAccelerator. Тогда это может иметь смысл.

Все остальные преимущества/недостатки констант уже были отмечены здесь и могут быть найдены в руководстве PHP.

Ответ 3

php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

+0,00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

+0,00941896438599

Это повторяемо с аналогичными результатами. Мне кажется, что константы немного медленнее определяют и/или используют, чем переменные.

Ответ 4

Вот отличия от manual

  • Константы не имеют знака доллара ($) перед ними;
  • Константы могут быть определены только с помощью функции define(), а не простым назначением;
  • Константы могут быть определены и доступны в любом месте без учета переменных правил видимости;
  • Константы не могут быть переопределены или undefined после их установки; и
  • Константы могут оценивать только скалярные значения.

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

Ответ 5

НЕ эффективен. (И я основываю все предположения здесь на одном комментарии от php.net, я все еще не делал тестов сам.)

ссылаясь на константу, потребуется 2x времени вызова переменной.

проверка существования константы займет 2 мс и 12 мс для ложного положительного!

Здесь приведен пример из комментариев страницы определения в онлайн-документе php.

Прежде чем использовать определенные(), посмотрите следующие этапы:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP версии 5.2.6, Apache 2.0, Windows XP

Каждый оператор был выполнен 1000 раз и в то время как накладные расходы на 12 мс 1000 звонков не заставят конечных пользователей разрывать волосы, он вызывает некоторые интересные результаты по сравнению с if (true):

1), если ($ true) было практически идентичным 2) если (TRUE_CONST) было почти в два раза медленнее - я думаю, что замена не выполняется при компиляции (мне пришлось дважды проверить это!) 3) defined() в 3 раза медленнее если константа существует 4) определена() равна 19 TIMES SLOWER, если константы не существует! 5) isset() замечательно эффективен независимо от того, что вы бросаете на него (отличные новости для тех, кто реализует массив управляемые системы событий - меня!)

Может быть, нужно избегать if (определяется ( "DEBUG" ))...

от tris + php при tfconsulting dot com dot au 26-Mar-2009 06:40

http://us.php.net/manual/en/function.defined.php#89886

Ответ 6

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

Ответ 7

Основные отличия:

  • define является константой, переменная переменной
  • они отличаются видимостью/видимостью

Ответ 8

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

Ответ 9

Не уверен в эффективности, но это больше, чем создание var:

  • Это константа: вы не можете переопределить или переназначить это НАСТРОЙКА.
  • Если определение не найдено, $something устанавливается на "SETTING", что полезно, например, в i18n: если перевод отсутствует (т.е. соответствующее определение является файлом локализации), мы видим большое слово в верхнем регистре, вполне видимое...