Вопрос

Препроцессор С++ #define это совершенно другое.

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

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

против

$setting = 0;  
$something = $setting;
Это было полезно?

Решение

Сама операция «определить» выполняется довольно медленно, что подтверждено профилировщиком xdebug.

Вот тесты из http://t3.dotgnu.info/blog/php/my-first-php-extension.html:

  • чистое «определить»
    380,785 выборок в секунду
    14,2647 среднее мс/первый ответ

  • константы, определенные с расширением «hidef»
    930,783 выборок в секунду
    6,30279 среднее мс/первый ответ


обновление неработающей ссылки

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

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

Другие советы

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

Вот вам и теория и плюсы - если скомпилировать.Теперь PHP довольно динамичен, и в большинстве случаев вы не заметите изменений, поскольку PHP-скрипт компилируется при каждом запуске.Могу сказать, что вы не должны видеть заметной разницы в скорости между константами и переменными, если вы не используете кеш байт-кода, такой как БТР, Дзен-оптимизатор или электронный акселератор.Тогда это может иметь смысл.

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

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

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

Вот отличия от руководство

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

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

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

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

проверка существования константы займет 2 мс, а ложное срабатывание — 12 мс!

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

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

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 раз, и, хотя накладные расходы на 1000 на 1000 вызовов не заставит конечных пользователей, вырывая свои волосы, это вызывает некоторые интересные результаты при сравнении с if (true):

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

Возможно, следует избегать if(define('DEBUG'))...

от tris+php в tfconsulting dot com dot au 26 марта 2009 г. 06:40

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

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

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

  • определение является константой, переменная является переменной
  • у них разный объем/видимость

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

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

  • Это константа:вы не можете переопределить или переназначить эту НАСТРОЙКУ.
  • Если определение не найдено, $something устанавливается в «SETTING», что полезно, например, в i18n:если перевод отсутствует (т.соответствующее определение — это файл локализации), мы видим большое слово в верхнем регистре, которое хорошо видно...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top