Birisi bu kod satırını lütfen açıklayabilir misiniz?

6 Cevap

Ben kod aşağıdaki satırları gördüm ve ben ne yaptıklarını biliyorum, ama (başka bir duruma uygulamak için nasıl ve dolayısıyla) ikinci hat nasıl çalıştığını bilmiyorum.

$user = User::model()->findByPk(123);
empty($user->profile) and $user->profile = new Profile();

Kod veritabanından Kullanıcı aramak çalışır, ve bir profil yoksa, daha sonra kullanılmak üzere yeni bir oluşturur.

Bu aşağıdaki gibi bir şey gider önce ben de kod gördük:

$variable1 = $variable2 = $variable3;

Bu aynı olması için üç şey atama basit biraz daha karmaşık bir şey yaptım, ama imkansız bu konuda herhangi bir bilgi bulmak için bu tür bir şey için arama dursun, ben rastladım orijinal kodunu bulmak için bulma yaşıyorum. Ben aslında orada bir yerde bir 've' vardı düşünüyorum. Kimse fazla bir tane var kod aramak için nasıl biliyor mu adil değil bir if ifadesi içinde oturum eşittir?

Biri (ve o da belirsiz) ve korkunç başlık (ben isimleri biliyorum ne zaman bir tenary açıklamada gibiyse ben bunu düzeltmek olacak)) iki soru için özür dilerim.

6 Cevap

Using Logical Operators to Skip Code: As php evaluates a line with the AND operator, if the fist part is false, the second part is not evaluated since it would not change the result.

empty() true döndürür Yani bu durumda, daha sonra php sağ tarafı değerlendirir. empty() false dönerse, artık değerlendirme yapılır ve profil etkilenmez.

Php manuel logical operators sayfası bu bazı çizimler vardır.

Multiple Assignment Operators: atama operatörü soldaki değişkene doğru ifade atar.

$variable1 = $variable2 = $variable3;

Bu durumda, $variable2 $variable3 then $variable1 $variable2 değerine ayarlanmış değerine ayarlanır . Php manuel assignment operators sayfa bu kapsar.

empty($user->profile) and $user->profile = new Profile();

and açıklamada, ilk öğe ilk olarak değerlendirilir; Eğer bu doğruysa, o zaman ikinci deyimi değerlendirilir, basit bir atama her zaman doğru değerlendirmek gerekir sanırım. İlk öğe yanlış ise, ikinci eleman değerlendirilmez.

Siz php dokümanlar operator precedence hakkında daha fazla bilgi edinebilirsiniz.

Bu temelde aynı şey

if (empty($user->profile))
    $user->profile = new Profile();

Gerçekten garip sözdizimi ...

Ne görüyorsanız birçok dilde kullanılmaktadır. İşte JavaScript kullanarak bir makale ... ama iyi kavramını açıklar.

http://css.dzone.com/articles/guard-and-default-operators-ja

Bu, yazmak için oldukça tuhaf bir yoldur. Ilk bölümü yanlış değerlendirir eğer bir PHP ifadesi ile, ifade render duracaktır.

Sanki yazarsanız:

if (x == 5 and y == 2)

yaparsa y == 2 ise x == 5, daha sonra, bu test edecek eğer test edecek. Eğer x! = 5, bu y == 2 test asla. Yukarıdaki kod $ user-> profili boş olup olmadığını test etmek için bu gerçeği kullanıyveya yüzden. Eğer öyleyse o zaman, $ user-> profile = new Profili () ait atama ifadesinin sonraki kısmı, çalışır; Temelde aynı gibi:

if (empty($user->profile))
    $user->profile = new Profile();

veya

empty($user->profile) ? $user->profile = new Profile();

As far as your second question, the operatveya = is just an assignment, so it means that the value of $variable1 will be set to the value of $variable2, which will be set to the value of $variable3.

PHP does some very nice things with expressions, which are really helpful to learn. Check out this link fveya mveyae info:

http://us.php.net/manual/en/language.expressions.php

$variable1 = $variable2 = $variable3;

PHP (eşittir işareti ile) atama sol öncelik hakkı vardır. PHP Her ifadenin bir dönüş değeri vardır. Yani ifadenin dönüş değeri $variable3 $variable2 atanır. Daha sonra ifade Reurn değeri $variable2 = $variable3 $variable1 atanır.