C / PHP ve değişken atama bileşik boolean ifadeler

1 Cevap php

Başlık aynen ben tam olarak soruyu açıklayan zor bir zaman yaşıyorum, soruyorum eşleşmiyor, beni affet.

Aşağıdaki PHP kodu göz önünde bulundurun:

#!/usr/bin/php
<?php
class foo{
    function bar()
    {
        return true;
    }
}
if (true && $a = new foo() && $a->bar()) {
    echo "true";
} else {
    echo "false";
}

Bu verir

Fatal error: Call to a member function bar() on a non-object

$ a-> bar () için; ifadesi.

Aşağıdaki C kodu göz önünde bulundurun:

int main(void)
{
    int i = 0;

    if (i += 1 && printf("%d\n", i))
    {
    	printf("Done: %d.\n", i);
    }
}

Bu çıkışlar:

0
Done: 1.

Neden bu? C ve PHP kısa devre bu ifadelerin iddia ve değerlendirmek sağa sola yana, ben beklemek ifadelerde ayarlanmış bir değeri sağ ifadeler kullanılmak üzere bıraktı. Kaçırdığım bir şey var mı?

1 Cevap

Senin sorunun şu anda operatör önceliği ile. PHP'nin gibi PHP deyimi değerlendirir:

if (true && $a = ( new foo() && $a->bar() ) )

Bu durumda $a Eğer $a->bar() çağırarak denemek zaman tanımlı değil.

Gerçekten istediğin bu:

if (true && ( $a = new foo() ) && $a->bar())

Karmaşık koşullarda parantez kullanılarak meydana gelen hatalar bu tür önlemek olacaktır.

EDIT: Proof

if(true && $a = true && false) { }
var_dump($a); // bool(false)

if(true && ( $b = true ) && false) { }
var_dump($b); // bool(true)