Сброс переменной против установки на '' - PullRequest
8 голосов
/ 11 января 2010

Лучше ли сделать одно из следующих действий? Если нет, то один из них быстрее другого?

unset($variable);

или делать

$variable = '';

Ответы [ 6 ]

11 голосов
/ 11 января 2010

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

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

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

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

если имя переменной больше не будет использоваться, значение unset должно быть на несколько циклов процессора быстрее (поскольку новое содержимое создавать не нужно). но если имя переменной будет использовано повторно, php придется создать новую запись в таблице переменных и символов, так что это может быть медленнее! разница будет незначительной разницей в большинстве ситуаций.

если вы хотите пометить переменную как недопустимую для последующей проверки, вы можете установить ее в false или в null. это было бы лучше, чем тестирование с помощью isset (), потому что опечатка в имени переменной вернула бы false безо всякой ошибки ... вы также можете передать ложные и нулевые значения другой функции и сохранить значение sentinel, чего нельзя сделать с помощью неустановленная переменная ...

так я бы сказал:

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

или

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

будет лучше для проверки дозорных значений, чем

unset($var); ...
if (isset($var)) ...
2 голосов
/ 11 января 2010

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

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

2 голосов
/ 11 января 2010

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

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

Обсуждается в docs:

unset () делает только то, что говорит его имя - сбросить переменную. Это не вызывает немедленного освобождения памяти. РНР сборщик мусора сделает это когда смотреть подходит - намеренно, как только эти циклы процессора не нужны, или еще раньше сценарий не хватает памяти, что бы ни происходило первый.

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

2 голосов
/ 11 января 2010

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

if(isset($test))

Поскольку он все еще «установлен», он просто устанавливается на пустое значение.

Однако он вернет true

if(empty($test))

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

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

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

unset($test);

чем это

$test = '';

первый сразу говорит вам, что переменная НЕТ ДЛИННОГО УСТАНОВКИ. Где, как последний просто говорит вам, он установлен на пустое место. Это обычно используется, когда вы собираетесь добавить материал в переменную и не хотите, чтобы PHP выдавал ошибку.

0 голосов
/ 11 января 2010

Здесь следует рассмотреть еще одну «ошибку», ссылку.

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

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

тогда, чтобы сделать любой из ваших двух вариантов, совершенно по-другому.

$variable = '';

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

unset($variable);

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

0 голосов
/ 11 января 2010

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

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

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

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

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

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

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

...