Что лучше использовать null или unset
Странно это сравнивать, ведь присвоение null говорит: «Чувак, переменная пуста!», тогда как unset намекает: «Обкурился штоле? Такой переменной нет.».
– user207618
30 авг 2016 в 20:40
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Между двумя этими операциями имеется разница
Присваивая переменной null , в таблице символов вашего скрипта остается переменная со значением null . Удаляя переменную при помощи конструкции unset() вы удаляете ее из таблицы символов.
Правильно удалять переменную unset() . Присвоением null вы не удаляете переменную, а присваиваете ей значение null — да isset() покажет false , но переменная существует. Более того, вы найдете еще несколько тонких моментов в случае переменных объектов и элементов массива. unset() удалит и значение и переменную из таблицы символов. Хотите удалить переменную — удаляйте unset() .
Отслеживать
ответ дан 30 авг 2016 в 20:34
19.4k 29 29 золотых знаков 47 47 серебряных знаков 139 139 бронзовых знаков
я слышал что unset срабатывает когда приходит сборщик мусора php (то есть не сразу, не при вызове unset), а вот null’ом можно сразу зачистить переменную
30 авг 2016 в 21:19
Врать не буду, не исследовал исходники на эту тему, однако разумно было бы просто занулять ссылку на выделенный объект при присвоении переменной null и собирать его потом штатно тем же сборщиком мусора. Дорогова-то зачищать каждую переменную в отдельности, если не позднее, чем через несколько секунд можно будет всю кучу скопом освободить (возможно даже не запуская сборщик).
30 авг 2016 в 21:25
да вот кстати разница будет только при случае если когда будет присвоение по ссылке $a = «10»; $b = &$a; $a = null; — как итог все в null а если применить вместо null, unset($a) , то переменная $b будет существовать со значением 10. просто я уже не знаю как правильно. запутался окончательно, кто-нибудь бы разъяснил все по полочкам, был бы благодарен
30 авг 2016 в 23:56
@MaximPro Правильно удалять переменную unset(). В случае с ссылкой все верно, вместо null вы можете подставить значение 10 и получите то же результат и $a, и $b получат одно и тоже значение. Присвоением null вы не удаляете переменную, а присваиваете ей значение null — да isset() покажет false, но переменная существует. Более того, вы найдете еще несколько тонких моментов в случае переменных объектов и элементов массива. unset() удалит и значение и переменную из таблицы символов. Хотите удалить переменную — удаляйте unset().
unset
unset() удаляет перечисленные переменные.
Поведение unset() внутри пользовательской функции может отличаться, в зависимости от того, какой тип имеет переменная, которую необходимо удалить.
Если переменная, объявленная глобальной, удаляется внутри функции, то будет удалена только локальная переменная. Переменная в области видимости вызова функции сохранит то же значение, что и до вызова unset() .
$foo = ‘bar’ ;
destroy_foo ();
echo $foo ;
?>
Результат выполнения данного примера:
Если необходимо удалить глобальную переменную внутри функции, то для этого нужно использовать массив $GLOBALS :
Если переменная, которая передается ПО ССЫЛКЕ, удаляется внутри функции, то будет удалена только локальная переменная. Переменная в области видимости вызова функции сохранит то же значение, что и до вызова unset() .
$bar = ‘something’ ;
echo » $bar \n» ;
Результат выполнения данного примера:
something something
Если статическая переменная удаляется внутри функции, unset() удалит переменную только в контексте дальнейшего выполнения функции. При последующем вызове предыдущее значение переменной будет восстановлено.
function foo ()
static $bar ;
$bar ++;
echo «До удаления: $bar , » ;
unset( $bar );
$bar = 23 ;
echo «После удаления: $bar \n» ;
>
?php
Результат выполнения данного примера:
До удаления: 1, После удаления: 23 До удаления: 2, После удаления: 23 До удаления: 3, После удаления: 23
Unset php что это
При сбросе ссылки, просто разрывается связь имени и содержимого переменной. Это не означает, что содержимое переменной будет уничтожено. Например:
$a = 1 ;
$b =& $a ;
unset( $a );
?>?php
Этот код не сбросит $b , а только $a .
Опять же, можно провести аналогию с вызовом unlink (в Unix).
User Contributed Notes 7 notes
15 years ago
Simple look how PHP Reference works
/* Imagine this is memory map
______________________________
|pointer | value | variable |
————————————
| 1 | NULL | — |
| 2 | NULL | — |
| 3 | NULL | — |
| 4 | NULL | — |
| 5 | NULL | — |
————————————
Create some variables */
$a = 10 ;
$b = 20 ;
$c =array ( ‘one’ =>array ( 1 , 2 , 3 ));
/* Look at memory
_______________________________
|pointer | value | variable’s |
————————————
| 1 | 10 | $a |
| 2 | 20 | $b |
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 | $c[‘one’][2] |
————————————
do */
$a =& $c [ ‘one’ ][ 2 ];
/* Look at memory
_______________________________
|pointer | value | variable’s |
————————————
| 1 | NULL | — | //value of $a is destroyed and pointer is free
| 2 | 20 | $b |
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 | $c[‘one’][2] ,$a | // $a is now here
————————————
do */
$b =& $a ; // or $b=&$c[‘one’][2]; result is same as both «$c[‘one’][2]» and «$a» is at same pointer.
/* Look at memory
_________________________________
|pointer | value | variable’s |
—————————————
| 1 | NULL | — |
| 2 | NULL | — | //value of $b is destroyed and pointer is free
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 |$c[‘one’][2] ,$a , $b | // $b is now here
—————————————
next do */
unset( $c [ ‘one’ ][ 2 ]);
/* Look at memory
_________________________________
|pointer | value | variable’s |
—————————————
| 1 | NULL | — |
| 2 | NULL | — |
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 | $a , $b | // $c[‘one’][2] is destroyed not in memory, not in array
—————————————
next do */
$c [ ‘one’ ][ 2 ]= 500 ; //now it is in array
/* Look at memory
_________________________________
|pointer | value | variable’s |
—————————————
| 1 | 500 | $c[‘one’][2] | //created it lands on any(next) free pointer in memory
| 2 | NULL | — |
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 | $a , $b | //this pointer is in use
—————————————
lets tray to return $c[‘one’][2] at old pointer an remove reference $a,$b. */
$c [ ‘one’ ][ 2 ]=& $a ;
unset( $a );
unset( $b );
/* look at memory
_________________________________
|pointer | value | variable’s |
—————————————
| 1 | NULL | — |
| 2 | NULL | — |
| 3 | 1 | $c[‘one’][0] |
| 4 | 2 | $c[‘one’][1] |
| 5 | 3 | $c[‘one’][2] | //$c[‘one’][2] is returned, $a,$b is destroyed
————————————— ?>
I hope this helps.
16 years ago
$a = «hihaha» ;
$b = & $a ;
$c = «eita» ;
$b = $c ;
echo $a ; // shows «eita»
$a = «hihaha» ;
$b = & $a ;
$c = «eita» ;
$b = & $c ;
echo $a ; // shows «hihaha»
$a = «hihaha» ;
$b = & $a ;
$b = null ;
echo $a ; // shows nothing (both are set to null)
$a = «hihaha» ;
$b = & $a ;
unset( $b );
echo $a ; // shows «hihaha»
$a = «hihaha» ;
$b = & $a ;
$c = «eita» ;
$a = $c ;
echo $b ; // shows «eita»
$a = «hihaha» ;
$b = & $a ;
$c = «eita» ;
$a = & $c ;
echo $b ; // shows «hihaha»
$a = «hihaha» ;
$b = & $a ;
$a = null ;
echo $b ; // shows nothing (both are set to null)
$a = «hihaha» ;
$b = & $a ;
unset( $a );
echo $b ; // shows «hihaha»
?>
I tested each case individually on PHP 4.3.10.
17 years ago
Your idea about unsetting all referenced variables at once is right,
just a tiny note that you changed NULL with unset().
again, unset affects only one name and NULL affects the data,
which is kept by all the three names.
unset
Поведение unset() внутри функции может различаться в зависимости от типа переменной, которую вы пытаетесь уничтожить.
Если глобализированная переменная unset() внутри функции, уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и до вызова unset().
function destroy_foo( ) < global $foo; unset($foo); > $foo = 'bar'; destroy_foo(); echo $foo; ?>
В приведенном выше примере выводится:
Чтобы unset() глобальную переменную внутри функции, затем используйте для этого массив $GLOBALS :
function foo( ) < unset($GLOBALS['bar']); > $bar = "something"; foo(); ?>
Если переменная PASSED BY REFERENCE является unset() внутри функции, уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и до вызова unset().
function foo(&$bar) < unset($bar); $bar = "blah"; > $bar = 'something'; echo "$bar\n"; foo($bar); echo "$bar\n"; ?>
В приведенном выше примере выводится:
something something
Если переменная static представляет собой unset() внутри функции, unset() уничтожает переменную только в контексте остальной части функции. Следующие вызовы восстановят предыдущее значение переменной.
function foo( ) < static $bar; $bar++; echo "Before unset: $bar, "; unset($bar); $bar = 23; echo "after unset: $bar\n"; > foo(); foo(); foo(); ?>
В приведенном выше примере выводится:
Before unset: 1, after unset: 23 Before unset: 2, after unset: 23 Before unset: 3, after unset: 23
Parameters
Переменная будет unset.