Сбрасывание переменной по сравнению с установкой на''

Это, лучше формируются, чтобы сделать одно из следующих? В противном случае один из них быстрее, чем другой?

unset($variable);

или сделать

$variable = '';
8
задан waiwai933 11 January 2010 в 04:11
поделиться

6 ответов

[11196181-

Они будут делать немного разные вещи:

  • unset будет удалять переменную от таблицы символов и будет уменьшить количество ссылок на содержимое 1. Ссылки на переменную после того, как это будет вызвать Уведомление («неопределенная переменная»). (Примечание. Объект может переопределить по умолчанию Unset поведение в его свойствах путем реализации __unset ()).

  • Установка к пустой строке будет умереть отсюда ссылки на содержимое 1, установите содержимое на строку 0-й длины, но символ все равно останется в таблице символов, и вы все еще можете ссылаться на переменную. (Примечание, объект может переопределить поведение назначения по умолчанию при его свойствах путем реализации __Set ()).

В старых PHP, когда Ref Count падает до 0, вызывается деструктор, и память освобождена немедленно. В более новых версиях PHP PHP использует буферизованную схему, которая имеет лучшую обработку для циклических ссылок ( http://www.php.net/manual/en/features.gc.collecting-size.Chies.pcp ), поэтому память может быть освобождена позже, то это может не быть задержано вообще ... в любом случае, что на самом деле не вызывает никаких проблем, а новый алгоритм предотвращает определенные утечки памяти.

Если имя переменной снова не будет использоваться, UNSET должен быть несколькими циклами CPU быстрее (так как новое содержимое не нужно создавать). Но если имя переменной повторно используется, PHP должен будет создать новую переменную и таблицу таблицы символов, чтобы она могла быть медленнее! Разница была бы незначительной разницей в большинстве ситуаций.

Если вы хотите пометить переменную как недействительную для последующей проверки, вы можете установить его на ложь или нулевой. Это было бы лучше, чем тестирование с помощью ISSET (), потому что опечатка в имени переменной вернет False без какой-либо ошибки ... Вы также можете пройти ложные и нулевые значения в другую функцию и сохранить значение Sentinel, которое не может быть сделано с unset var ...

Так что я бы сказал:

$var = false; ...
if ($var !== false) ...

или

$var = null; ...
if (!is_null($var)) ...

было бы лучше для проверки ценностей Sentinel, чем

unset($var); ...
if (isset($var)) ...
11
ответ дан 5 December 2019 в 10:03
поделиться

Технически $ test = '' вернется к

if(isset($test))

, потому что он все еще «набор», он просто установлен на пустое значение.

Это, однако, вернутся к

if(empty($test))

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

Так что лучше просто решать его полностью.

Кроме того, это легче понять

unset($test);

, чем это

$test = '';

, первое немедленно говорит вам, что переменная больше не установлена. Где, как последний просто говорит вам, что он установлен в пустое пространство. Это обычно используется, когда вы собираетесь добавить вещи в переменную и не хотите, чтобы ошибка PHP на вас.

2
ответ дан 5 December 2019 в 10:03
поделиться

Вы делаете разные вещи, целью unset состоит в том, чтобы уничтожить указанную переменную в контексте, где вы делаете его, ваш второй пример просто устанавливает переменную к пустой строкой.

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

Обсуждается в документах :

unset () делает только то, что это название - unset с переменной. Это не заставляет немедленное освобождение памяти. PHP's. Сборщик мусора сделает это, когда это увидеть подходящие - намерением, как скорее, как Эти циклы ЦП не нужны в любом случае, или еще до того, как перед скриптом Выйди из памяти, что бы ни происходило первый.

Если вы делаете $, что угодно = нуль; Тогда вы переписываете переменную данные. Вы можете получить память, освобожденную / сжался быстрее, но он может украсть ЦП циклы из кода, который по-настоящему нужно их рано, в результате чего дольше общее время исполнения.

2
ответ дан 5 December 2019 в 10:03
поделиться

У них совершенно разные значения. Первый делает переменную несущественную. Последнее просто устанавливает его значение для пустой строки. Неважно, какой из них «лучше» так сказать, потому что они для совершенно разных вещей.

Вы пытаетесь убрать память или что-то? Если это так, не делать; PHP управляет памятью для вас, чтобы вы могли покинуть его, и он будет очищен автоматически.

Если вы не пытаетесь убрать память, то вам нужно выяснить , почему Вы хотите, чтобы выбрать переменную или установить его для опорожнения, и выберите соответствующую. Одной из хороших здравооборотитесь на это: давайте скажем, кто-то вставил следующую строку кода где-то после вашего unset / пусто:

if(strcmp($variable, '') == 0) { do_something(); }

, а затем, позже:

if(!isset($variable)) { do_something_else(); }

Первый запустится do_something () , если вы установлены переменная к пустой строке. Второй будет запущен do_something_else () , если вы не заканчиваете переменную. Что из этого вы ожидаете запускать, если ваш сценарий ведет себя правильно?

0
ответ дан 5 December 2019 в 10:03
поделиться

Есть еще одна «чта», чтобы рассмотреть здесь, ссылку.

Если у вас было:

$a = 'foobar';
$variable =& $a;

, то делать то, что либо из ваших двух альтернатив довольно разные.

$variable = '';

Устанавливает как $ переменную, так и $ a в пустую строку, где в виде

unset($variable);

удаляет ссылку между переменной $ av и $ во время удаления $ переменной из таблицы символов. Это действительно единственный способ разбить переменную $ a и $ без установки $ переменных для ссылки на что-то еще. Примечание, например, $ variable = null; не сделаю это.

0
ответ дан 5 December 2019 в 10:03
поделиться

Sinkhole предприятия:

1: прочитайте, что доступ к базе данных должен быть на отдельном уровне

2: Эй, у нас есть уровень базы данных.

2 (b) Эй, у нас даже есть делегированный слой, чтобы абстрагироваться от нашей базы данных.

3: Примените закон утечек абстракций -i.e, так как в делегатах есть методы, которые получают вещи, просто предположим, что они там, чтобы использовать без мысли о последствиях - как в вызове «getPurchaseOrder ()» 10 раз подряд на странице, даже если getPurchaseOrder () является методом, который оборачивается 5 отдельных вызовов базы данных.

4: Сидите и наслаждайтесь своими веб-страницами, которые загружаются с 100 отдельными вызовами базы данных (к сожалению, не преувеличение).

Не уверен, что я бы назвал это антиобразцом? Может быть «Слои не свободны»?

-121--4294089-

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

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
-121--1560780-

Я думаю, что самое важное отличие заключается в том, что отключение переменной сообщает, что переменная не будет использоваться последующим кодом (она также «принудительно» это, сообщая о E_NOTICE, если вы пытаетесь использовать ее, так как jspcal сказал, что это потому, что это

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

2
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: