'' Ayarı vs bir değişken unsetting

6 Cevap php

Bu aşağıdakilerden birini yapmak için daha iyi bir formu var mı? Eğer değilse, diğer daha hızlı bunlardan biri?

unset($variable);

ya da yapmak

$variable = '';

6 Cevap

Onlar biraz daha farklı şeyler yapacağız:

  • unset sembol tablosundan değişkeni kaldırmak ve 1 ile içeriğine başvuru sayısı azaltacaktır. bundan sonra değişkene referanslar bir haber ("tanımsız değişken") tetikler. (__ Unset () bir nesne uygulayarak kendi özelliklerine varsayılan tanımsız davranışı geçersiz kılabilirsiniz, unutmayın).

  • boş bir dizeye ayarlayarak, 1 ile içeriğine başvuru sayısını azaltma 0-uzunlukta dize içeriğini ayarlamak, ancak sembol yine sembol tablosunda kalır, ve hala değişken başvuruda bulunabilir olacaktır. () (Bir nesne __ set uygulayarak kendi özelliklerine varsayılan atama davranışı geçersiz kılabilirsiniz, unutmayın).

ref sayısı 0'a düştüğünde eski php yılında, yıkıcı denir ve bellek derhal serbest. yeni sürümleri (> = 5.3), php döngüsel başvurular (http://www.php.net/manual/en/features.gc.collecting-cycles.php) için daha iyi yol tutuşu olan bir tamponlu şeması kullanır, bu yüzden hiç gecikmiş olabilir tho aninin, daha sonra serbest olabilir .. . her durumda, gerçekten herhangi bir sveyaun neden olmaz ve yeni algveyaitma belli bir bellek sızıntıları önler.

değişken adını tekrar kullanılmaz eğer (yeni içerikler oluşturulacak gerekmez beri), unset daha hızlı bir işlemci birkaç döngüleri olmalıdır. Değişken ismi yeniden kullanılabilir ama eğer, php, yeni bir değişken ve sembol tablosu girişi oluşturmak gerekir, bu yüzden daha yavaş olabilir! fark çoğu durumda ihmal edilebilir bir fark olacaktır.

Daha sonra kontrol için değişken olarak geçersiz işaretlemek istiyveyasanız, yanlış veya boş için ayarlayın. değişken adı bir yazım hatası herhangi bir hata olmadan false dönecekti çünkü) (isset ile test daha iyi olurdu ... ayrıca başka bir işleve yanlış ve boş değerleri geçmesine ve birlikte yapılamaz sentinel değer, kveyauyabilirsiniz unset var ...

bu yüzden diyveyaum ki:

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

veya

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

would be better fveya checking sentinel values than

unset($var); ...
if (isset($var)) ...

Teknik $test = '' true dönecektir

if(isset($test))

Hala 'set' Çünkü, bu sadece boş bir değer tr ayarlanır.

Ancak gerçek dönecektir

if(empty($test))

boş bir değişken olduğu gibi. Bu sadece sizin için kontrol ne bağlıdır. Genellikle insanlar olsa boş ise değişken isset kontrol yerine eğilimindedir.

Yani bu tamamen o sadece tanımsız daha iyidir.

Ayrıca, bu anlamak kolaydır

unset($test);

Bu daha

$test = '';

İlk hemen değişken ARTIK SET olduğunu söyler. Ikincisi olarak sadece size söyler Nerede bir boşluk ayarlanır. Bir değişkene şeyler eklemek ve PHP size erroring istemiyorum giderken bu yaygın olarak kullanılır.

Siz farklı şeyler, unset bunu yapmak nerede bağlamında belirtilen değişken yok etmek amacı yapıyoruz, ikinci örnek, sadece boş bir dizeye değişkeni ayarlar.

Bir değişkeni unsetting Eğer performans konusunda endişeleriniz varsa-NULL daha iyi bir seçenek olabilir için değişken ayarı, anlık bellek kurtararak zorlamak değil, ama gerçekten, farkı fark olmayacaktır ...

Tartışılan docs :

unset() does just what it's name says - unset a variable. It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first.

If you are doing $whatever = null; then you are rewriting variable's data. You might get memory freed / shrunk faster, but it may steal CPU cycles from the code that truly needs them sooner, resulting in a longer overall execution time.

Ben en alakalı fark değişkeni unsetting (eğer jspcal o sembolü de değil, çünkü bu dediğim gibi kullanmaya çalışırsanız o da bir E_NOTICE bildirdiği bu "zorlar" değişken sonraki kod tarafından kullanılan olmayacak iletişim olduğunu düşünüyorum tablo artık).

Boş dize size değişkeni ile ne yapıyorsun için bir yasal (veya nöbetçi) değeri, bu nedenle,'' devam edin ve ayarlayın. Değişken unsetting, artık yararlı Aksi halde, eğer net kod niyet için yapar.

Onlar tamamen farklı anlamları vardır. Eski bir değişken var olmayan yapar. İkincisi sadece boş bir dize değerini ayarlar. Bu biri olduğu önemli değil "iyi" onlar tamamen farklı şeyler için çünkü, bu yüzden konuşmak için.

Eğer bellek falan temizlemek için çalışıyor musunuz? Eğer öyleyse, değil; PHP sizin için belleği yönetir, böylece etrafında döşeme bırakın ve otomatik temizledik alırsınız.

Eğer belleğini temizlemek için çalışıyor değilseniz, o zaman why Bir değişken unset veya boşaltmak için ayarlamak istediğiniz anlamaya ve uygun olanı seçmeniz gerekir. Bunun için iyi bir sağlamlık denetimi: Hadi birileri sizin unset / boş sonra kod aşağıdaki satırı eklenir diyelim:

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

Ve sonra, sonra:

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

Eğer boş dize değişkeni ayarlamak durumunda ilk do_something() çalışacaktır. Eğer değişken unset eğer ikinci do_something_else() çalışacaktır. Script düzgün davrandığını, bu hangi çalıştırmak için bekliyorsunuz?

Burada dikkate bir diğer 'yakaladım', referans var.

Eğer olsaydı:

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

sonra iki alternatiften birini yapmak için oldukça farklı.

$variable = '';

$ değişken ve $ a hem de boş dize, nereye kadar setleri

unset($variable);

sembol tablosundan $ değişken çıkarılırken $ a $ ve değişken arasındaki bir referans linki kaldırır. Bu gerçekten başka bir şey başvurmak için $ değişken koymadan $ a $ ve değişken bağlantısını kesmek için tek yoldur. Örneğin, $ değişken = null Not; bunu yapmayacağım.