Препроцессор C ++ #define
совершенно другой.
Является ли PHP define()
чем-то другим, чем просто создание var?
define("SETTING", 0); $something = SETTING;
против
$setting = 0; $something = $setting;
Операция «define» сама по себе довольно медленная – подтверждается профилировщиком xdebug.
Ниже приведены эталоны из http://t3.dotgnu.info/blog/php/my-first-php-extension.html :
чисто "определить"
380.785 выборки / сек
14.2647 означает msecs / first-response
константы, определенные с расширением 'hidef'
930.783 выборки / сек
6.30279 среднее значение msecs / first-response
обновление неработающей ссылки
Сообщение в блоге, упомянутое выше, покинуло интернет. Его можно просмотреть здесь через Wayback Machine . Вот еще одна подобная статья .
Библиотеки, на которые ссылаются автор, можно найти здесь (apc_define_constants) и здесь (hidef extension) .
В общем, идея константы должна быть постоянной (звучит смешно, правильно?;)) Внутри вашей программы . Это означает, что компилятор (интерпретатор) заменит «FOOBAR» значением FOOBAR на весь ваш скрипт.
Так много для теории и преимуществ – если вы скомпилируете. Теперь PHP довольно динамичен, и в большинстве случаев вы не заметите другого, потому что скрипт PHP скомпилирован при каждом запуске. Afai-can-tell вы не должны видеть заметную разницу в скорости между константами и переменными, если вы не используете кеш-код, такой как APC , Zend Optimizer или eAccelerator . Тогда это может иметь смысл.
Все остальные преимущества / недостатки констант уже были отмечены здесь и могут быть найдены в руководстве по 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
Это повторяемо с аналогичными результатами. Мне кажется, что константы немного медленнее определяют и / или используют, чем переменные.
Вот отличия от руководства
Для меня главным преимуществом является глобальный охват. Я, конечно, не беспокоюсь об их эффективности – используйте их всякий раз, когда вам нужно глобальное скалярное значение, которое нельзя изменять.
НЕ эффективен. (И я основываю все предположения здесь на одном комментарии от 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 () is 3 раза медленнее, если константа существует 4) определяется () равно 19 TIMES SLOWER, если константа не существует! 5) isset () замечательно эффективен независимо от того, что вы бросаете на него (отличные новости для тех, кто внедряет системы событий, управляемых массивами – меня!)
Может хотеть избежать, если (определено («DEBUG»)) …
от tris + php при tfconsulting dot com dot au 26-Mar-2009 06:40
Определение – это простой статический смысл, то есть его значение не может быть изменено во время выполнения, в то время как переменная – динамическая, потому что вы можете свободно манипулировать ее значением в процессе.
Основные отличия:
Когда я запускаю тесты скорости, константы, которые устанавливаются и выгружаются, запускаются намного быстрее, чем установка переменных и их сброс.
Не уверен в эффективности, но это больше, чем создание var: