Yazma bağlamında yöntem dönüş değeri kullanılamıyor


465

Aşağıdaki kod parçası çalışması düşünürdüm, ama çalışmıyor (Düzenlendi: Şimdi PHP 5.5+ çalışır) :

if (!empty($r->getError()))

getError()Basitçe nerede :

public function getError()
{
    return $this->error;
}

Yine de bu hatayla karşılaşıyorum:

yazma bağlamında yöntem dönüş değeri kullanılamıyor

Ne anlama geliyor? Bu sadece bir okuma değil mi?


2
Muhtemelen PHP 5.5'te ifadeleri iletmenize izin verilecektir empty: wiki.php.net/rfc/empty_isset_exprs
Carlos Campderrós 31:12


Tamam ben de geçerli HTML DOM öğesinin boş olup olmadığını kontrol kodumu bu porneL cevap doğru bulmak if ( !$e->find('div') ) . İçteki Div olmadan sadece tek bir Div yazdırmak için döngü içinde kullanıyorum.
Salem

Yanıtlar:


769

empty() değere başvuru ile erişmesi gerekir (bu başvurunun var olan bir şeye işaret edip etmediğini kontrol etmek için) ve 5.5'ten önceki PHP işlevlerden döndürülen geçici değerlere başvuruları desteklemiyordu.

Ancak, asıl sorun empty(), "boş" değerin "yanlış" değerinden farklı olduğuna inanarak, hiç kullanmamanızdır.

Empty sadece bir takma addır !isset($thing) || !$thing. Kontrol ettiğiniz şey her zaman mevcut olduğunda (PHP'de işlev çağrılarının sonuçları her zaman mevcuttur), empty()işlev bir olumsuzlama operatöründen başka bir şey değildir .

PHP'nin boşluk kavramı yoktur . False olarak değerlendirilen değerler boş, true olarak değerlendirilen değerler boş değildir. Aynı şey. Bu kod:

$x = something();
if (empty($x)) 

ve bu:

$x = something();
if (!$x) 

her durumda tüm veri türleri için her zaman aynı sonuca sahiptir (çünkü $xtanımlanmıştır empty()gereksizdir).

Yöntemin dönüş değeri her zaman vardır (ifadeniz olmasa bile return, dönüş değeri vardır ve içerir null). Bu nedenle:

if (!empty($r->getError()))

mantıksal olarak şuna eşittir:

if ($r->getError())

29
Bu, seçili olandan çok daha iyi bir cevaptır.
SystemParadox

20
@gcb: hayır, PHP kılavuzu açıkça aynı olduğunu söylüyor: "boş () bunun tersidir (boolean) var, ancak değişken ayarlanmadığında hiçbir uyarı üretilmez."
Kornel

16
Bir uyarı kısmı oluşturmamak oldukça önemlidir ... 0 ('', array (), NULL veya tanımlanmamışsa empty ($ var) true değerini döndürür. Bu özellikle iyi bir uygulamadır, böylece dosyaları doldurmadan gerçek uyarılarınızı kaydedebilirsiniz
landons

3
Tamam, harika bir yanıt, ama bundan kaçınmanın doğru yolu nedir, bilen var mı?
Javatar

3
Genel olarak @EugenMihailescu sakınca olmadığını, ama bunun nedeni, kesinlikle () boşaltmak için eşdeğer değil "", 0null, vb "boş" duruma gelir ancak.
Kornel

330

Not: Bu, yüksek bir görünürlük ile çok yüksek oy alan bir cevaptır, ancak kötü, gereksiz kodlama uygulamalarını teşvik ettiğini lütfen unutmayın! Doğru yol için @ Kornel'in cevabına bakınız .

Not # 2: @ Kornel'in cevabını kullanma önerilerini onaylıyorum . Bu cevabı üç yıl önce yazdığımda, sadece alternatifin onaylanması değil, hatanın doğasını açıklamak istedim. Aşağıdaki kod snippet'i önerilmez.


5.5'in altındaki PHP sürümlerinde empty () yönteminin bir sınırlamasıdır .

Not: empty () yalnızca değişkenleri kontrol eder, çünkü başka bir şey ayrıştırma hatasına neden olur. Başka bir deyişle, aşağıdakiler çalışmaz: boş (trim ($ name)).

Bunu değiştirmek zorunda kalacaksın

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
Bu delicesine verimsiz.
David Murdoch

47
Not: Aynısı için de geçerlidir isset(). ie: isset($this->foo->getBar())aynı sorunla sonuçlanır.
catchdave

7
porneL'nin cevabı bunu daha iyi bir çözümle daha ayrıntılı olarak açıklıyor
SystemParadox

5
@SystemParadox - "Daha iyi" ile ne demek istediğinize bağlı. porneL'in cevabı tartışmasız bir "temiz" çözümle daha ayrıntılıdır, fakat aynı zamanda hatanın kaynağını da açıklamamaktadır.
Peter Bailey

4
Çünkü bu yanlış değil, @deceze. En iyi cevap bu değil, orada benden bir tartışma almayacaksın. Hatta porneL'in kendim için oy verdim. Bu çok eski bir cevap ama yanlış değil . Yüksek oylarla ilgili olarak: unutmayın, porneL'ler bundan yaklaşık 17 ay sonra geldi.
Peter Bailey

37

Göre PHP docs :

empty () yalnızca değişkenleri kontrol eder, çünkü başka bir şey ayrıştırma hatasına neden olur

empty()Bir işlevin dönüş değeri üzerinde doğrudan kullanamazsınız . Bunun yerine, dönüşü getError()bir değişkene ayarlayın ve değişken empty()üzerinde çalıştırın .


19

Genellikle sadece bu sorunu çözmek için is_empty () adlı küresel bir işlev oluşturmak

function is_empty($var)
{ 
 return empty($var);
}

Sonra her yerde normalde boş () kullanırdım Ben sadece is_empty () kullanın


2
Bunu yapmamak ve standartlara bağlı kalmak daha iyidir (olabildiğince can sıkıcı).
tonyhb

1
@ dinamizm neden olmasın açıklayabilir misiniz?
Janis Veinbergs

1
Çünkü kolaylık fonksiyonları başkasının kodunda okunacak bir acı olabilir. Ayrıca, bir MVC / HMVC mimarisinde yapınızı bozabilir. Günün sonunda, PHP kodlayıcıları bunun sınırlamalarını bilmeli ve kolaylık fonksiyonları olmadan küçük geçici çözümleri anlayabilmelidir.
tonyhb

14
Vay, az önce bir olumsuzlama fonksiyonu icat ettin . PHP bunun için !operatör var biliyor musun ? :)
Kornel

4

Başkaları tarafından işaret edildiği gibi, boş () bir (garip) sınırlamasıdır.

Çoğu purproses için bunu yapmak boş çağırmakla aynıdır, ancak bu işe yarar:

if ($r->getError() != '')

5
Bu doğru değil - empty()boş bir dizeden çok daha fazla olasılığı kapsar
Robbie Averill

3
O "diyor yüzden çoğu amaçlar " değil, bütün
Jani Hartikainen

2

Sorun şudur, hatanın boş olup olmadığını bilmek istersiniz.

public function getError() {
    return $this->error;
}

İsErrorSet () yöntemi eklenmesi sorunu çözecektir.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Şimdi bu uyarı ile bu kod ile iyi çalışacaktır.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

Bir dizinin boş olup olmadığını kontrol etmenin alternatif yolu:

count($array)>0

Bu hata olmadan benim için çalışıyor

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.