PHP'de ayarı kaldırmadan önce var olup olmadığını kontrol edin?


89

PHP'de bir değişkenin ayarını kaldırırken hata bildirimi açıkken veya hatta en iyi uygulama için, önce var olup olmadığını (bu durumda her zaman mevcut değildir) ve sıfırlanıp kaldırılmadığını mı kontrol etmelisiniz?

<?PHP
if (isset($_SESSION['signup_errors'])){
    unset($_SESSION['signup_errors']);
}

// OR

unset($_SESSION['signup_errors']);
?>


1
Bu daha verimlidir NOTkullanım isset. Cevabıma bir bak. Hız farkını bulmak için testler yaptım.
Dan Bray

Yanıtlar:


171

Sadece ayarlayın, yoksa hiçbir şey yapılmayacaktır.


3
Bir uyarı veya bildirim atmak olsaydı bilmiyordum
JasonDavis

20
@SilentGhost Kabul ediyorum, çok basit bir test gibi görünüyor, ancak profesyonel tavsiye istiyorlar ve hata günlüğünde tanımlanmamış bir değişkeni bozan herhangi bir hata / uyarı / bildirim olmayabilir, ancak günlüğe kaydedilmemiş başka sorunlar da olabilir. Örneğin, sadece unset çağrısı yapmak PHP'nin TÜM var verilerini taraması anlamına gelir çünkü hiçbir şey bulamaz, oysa kullanmak if setdaha iyi bir indeksleme şemasına sahip olabilir. (Sadece bir örnek, önceki muhtemelen ayakkabıcılardır ve her iki yaklaşım da aynı veri kontrol yöntemini kullanır).
James

Doğru ve aynı zamanda daha verimli. Cevabıma bir bakın çünkü kullanmayan issetayetleri kullanma hızını test ettim isset.
Dan Bray

oy azaltma - tanımlanmamış dizi anahtarlarını kaldıramazsınız.
Behnam

1
@jascha dedim, yapamayız!
Behnam

48

PHP Kılavuzundan :

Bu notların önceki bölümlerinde, mevcut olmayan değişkenleri kaldırırken unset () 'in uyarıları tetiklemesine neyin sebep olduğuna dair bazı karışıklıklara gelince ...

Mevcut olmayan değişkenleri, olduğu gibi

<?php
unset($undefinedVariable);
?>

"Tanımsız değişken" bildirimini tetiklemez. Fakat

<?php
unset($undefinedArray[$undefinedKey]);
?>

bu kod bir dizinin bir elemanını silmeye yönelik olduğu için iki uyarı tetikler; ne $ undefinedArray ne de $ undefinedKey kendileri ayarlanmıyor, sadece neyin ayarlanmaması gerektiğini bulmak için kullanılıyorlar. Sonuçta, eğer olsalardı, daha sonra ikisinin de ortalıkta olmasını beklerdiniz. Sırf onun elemanlarından birini ayarlamadığınız () için dizinizin tamamının yok olmasını İSTEMEZSİNİZ!


42
Bunun biraz daha açıklığa ihtiyacı var. Dizinin kendisi var olduğu sürece, tanımlanmamış dizi anahtarlarının ayarını kaldırabilirsiniz.
kingmaple

@kristovaher Gerçekten - bu, OP'nin tanımladığı özel senaryoyu hiç ele almıyor.
Mark Amery

23

Kullanma unsetTanımlanmamış bir değişkeni herhangi bir hataya neden olmaz (değişken, var olmayan bir dizinin (veya nesnenin) indeksi olmadığı sürece).

Bu nedenle, göz önünde bulundurmanız gereken tek şey, en verimli olanıdır. Testimin göstereceği gibi 'isset' ile test etmemek daha etkilidir.

Ölçek:

function A()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($defined);
    }
}

function B()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($undefined);
    }
}

function C()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($defined))
            unset($defined);
    }
}

function D()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($undefined))
            unset($undefined);
    }
}

$time_pre = microtime(true);
A();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function A time = $exec_time ";

$time_pre = microtime(true);
B();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function B time = $exec_time ";

$time_pre = microtime(true);
C();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function C time = $exec_time ";

$time_pre = microtime(true);
D();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function D time = $exec_time";
exit();

Sonuçlar:

  1. Function A time = 1.0307259559631
    • İsset olmadan tanımlandı
  2. Function B time = 0.72514510154724
    • İsset olmadan tanımsız
  3. Function C time = 1.3804969787598
    • İsset kullanılarak tanımlandı
  4. Function D time = 0.86475610733032
    • İsset kullanılarak tanımlanmamış

Sonuç:

issetYazmak için gereken az miktardaki fazladan sürenin yanı sıra, kullanımı her zaman daha az verimlidir . unsetTanımlanmamış bir değişkeni denemek , olup olmadığını kontrol etmekten daha hızlıdır unset.


1
Bu, kabul edilen cevaptan çok daha iyi! Bu testleri yaptığınız için teşekkürler.
Adam Friedman

3

Bir değişkeni geri almak istiyorsanız, sadece unset

unset($any_variable); // bool, object, int, string etc

Bir değişkeni sıfırlamaya çalışırken varlığını kontrol etmenin hiçbir faydası yoktur.

Değişken bir diziyse ve bir elemanı geri almak istiyorsanız, önce ebeveynin var olduğundan emin olmalısınız , bu nesne özellikleri için de geçerlidir.

unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array

unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object

Bu, unsetbir if(isset($var)){ ... }bloğun içine sarılarak kolayca çözülür .

if(isset($undefined_array)){
    unset($undefined_array['undefined_element_key']); 
}

if(isset($undefined_object)){
    unset($undefined_object->undefined_prop_name); 
}

Sadece değişkeni ( üst öğe) kontrol etmemizin nedeni, özelliği / öğeyi kontrol etmemizin gerekmemesidir ve bunu yapmak fazladan bir kontrol ekleyeceği için yazmak ve hesaplamak çok daha yavaş olacaktır.

if(isset($array)){
...
}

if(isset($object)){
...
}

.vs

$object->prop_name = null;
$array['element_key'] = null;

// This way elements/properties with the value of `null` can still be unset.

if(isset($array) && array_key_exists('element_key', $array)){
...
}

if(isset($object) && property_exists($object, 'prop_name')){
...
}

// or 

// This way elements/properties with `null` values wont be unset.

if(isset($array) && $array['element_key'])){
...
}

if(isset($object) && $object->prop_name)){
...
}

Bu söylemeye gerek yok ama typebir öğeyi veya özelliği alırken, ayarlarken ve bozarken değişkeni bilmeniz de çok önemlidir ; yanlış sözdizimini kullanmak bir hataya neden olur.

Çok boyutlu bir dizinin veya nesnenin değerini silmeye çalışırken de aynıdır. Ana anahtarın / adın var olduğundan emin olmalısınız.

if(isset($variable['undefined_key'])){
    unset($variable['undefined_key']['another_undefined_key']);
}

if(isset($variable->undefined_prop)){
    unset($variable->undefined_prop->another_undefined_prop);
}

Nesnelerle uğraşırken düşünülmesi gereken başka bir şey daha var ve bu da görünürlük.

Sadece var olması onu değiştirme izniniz olduğu anlamına gelmez.


Son olarak, uygun bir cevap. Teşekkür ederim.
wp78de

Küçük bir güncelleme: PHP 7.4 / 8.0'da, unsetvar olmayan bir üst nesnenin özelliği olduğunuzda hata atılmaz . Bununla birlikte, PHP8'de mevcut olmayan bir dizideki bir anahtarı sarsmak sadece bir uyarı değil, bir uyarı da (değişebilir) ortaya çıkar.
wp78de

1

Bu bağlantıyı kontrol edin https://3v4l.org/hPAto

Çevrimiçi araç, PHP'nin farklı sürümleri için kod uyumluluğunu gösterir

Bu araca göre kod

unset($_SESSION['signup_errors']);

PHP> = 5.4.0 için size herhangi bir uyarı / uyarı / hata vermeden çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.