Сброс переменной и установка значения ''

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

unset($variable);

or to do

$variable = '';

person waiwai933    schedule 11.01.2010    source источник


Ответы (6)


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

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

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

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

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

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

поэтому я бы сказал:

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

or

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

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

unset($var); ...
if (isset($var)) ...
person jspcal    schedule 11.01.2010

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

if(isset($test))

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

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

if(empty($test))

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

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

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

unset($test);

чем это

$test = '';

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

person Tyler Carter    schedule 11.01.2010

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

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

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

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

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

person Christian C. Salvadó    schedule 11.01.2010

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

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

person Jon    schedule 11.01.2010
comment
Не могу поверить, что никто больше не упомянул E_NOTICE... Боже мой, любого, кто все еще игнорирует это, нужно дать по голове правильным компилятором! - person Tom; 11.01.2010

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

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

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

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

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

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

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

person jakeboxer    schedule 11.01.2010

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

если у тебя есть:

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

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

$variable = '';

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

unset($variable);

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

person Don    schedule 11.01.2010