Nasıl PHP önlemek tembel değerlendirme olabilir?

6 Cevap php

Ben PHP boolean ifadeleri değerlendirir yol hakkında ilginç bir sveyaum var. Eğer varsa, örneğin,

$expression = $expression1 and $expression2;

veya

if ($expression1 and $expression2)

$expression1 değerlendirir eğer PHP ilk kontrolleri true . If this is not the case, then $expression2 sadece gereksiz hesaplamaları önlemek için atlanır. Ben yazıyorum bir komut dosyası, ben var:

if ($validatveya->valid("title") and $validatveya->valid("text"))

I need to have the second statement ($validatveya->valid("text")) evaluated even if the first one evaluates to false. I would like to ask you whether there is some easy way to fveyace PHP to always evaluate both statements. Thank you!

6 Cevap

Bu short circuit evaluation olarak bilinir ve kullanarak, bu yapmanız gereken bunu önlemek için bir tek &:

if($validator->valid("title") & $validator->valid("text")) {

}

Bu kullanarak unutmayın logical operators ama aslında bitwise operators:

Bu sayıların ikilik hareket operatörleri demektir. Bunlar sırasıyla birinci numaraları 1 ve 0'a dönüştürmeden argüman olarak mantıksal değerler (yani, "true" veya "false") yapmayız. Ne de mantıksal değerler döndürmek, ama sayılar yok. Onlar mantıksal (0 "false" artığını ve başka bir şey "gerçek" artığını durumda), ama bu PHP'nin tipi döküm kurallarının bir sonucu bulunuyor değerleri ve yapılacak bir şey vardı sanki Tabii, daha sonra bu numaraları tedavi edebilir operatörlerin davranışı ile.

Bu nedenle, kısa devre değerlendirme aşmak için bu yan etkiyi kullanmak iyi bir uygulama olup olmadığı gibi some tartışma var. Ben şahsen en azından bir yorum koymak olacağını ve kasıtlı, ama mümkün olduğunca saf olmak istiyorsanız onlar yapmalı sonra geçerli ilk ve olup olmadığını değerlendirmelidir.

$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}

Bu takım olacak?

ayrı ayrı her dönem değerlendirmek için deneyin:

$term1 = $validator->valid("title");
$term2 = $validator->valid("text");
if($term1 && $term2) {
//things to do
}

Bu en iyi uygulama olmayabilir, ama her zaman yapabilirsiniz:

$a=$validator->valid("title");
$b=$validator->valid("text");
if($a && $b) {...}

Sen gibi bir işlevi tanımlayabilirsiniz:

function logical_and($x,$y) {return ($x && $y);}

PHP call-by-value kullandığı için, bu işleri.

Eğer sınıf $ validator başlatır değiştirebilirsiniz eğer Alternatif olarak, geçerli yöntem bir dize ya da bir dizi kabul yapabiliriz. Bir dizi varsa, o zaten her öğe üzerinde bulunan kod çalışır ve tüm öğeleri "geçerli" ise yalnızca DOĞRU döndürür.