Php mantıksal operatör özel veya. PHP: Mantıksal Operatörler - Kılavuz. parantez operatörü

  • 20.06.2020

PHP aşağıdaki standardı destekler mantıksal operatörler: "VE" ve "&&" (mantıksal VE), "VEYA" ve "||" (mantıksal VEYA), "!" (mantıksal DEĞİL) ve "XOR" (özel VEYA). Bunların tümü, ifade tarafından döndürülen sonuca bağlı olarak belirli bir program yürütme sürecini belirlemek için mantıksal ifadelerde kullanılır ve "!" hariç ikili operatörlere atıfta bulunur. hangisi teklidir. Mantıksal operatörleri kullanırken, işlenenleri Boole veri türüne () dönüştürülür ve sonuç, işlenenlerin verilen mantıksal değerlerine ve mantıksal operatörün türüne bağlıdır (bkz. tablo 1).

Tablo 1. Mantıksal operatörler

"AND" ve "&&" operatörleri ile "OR" ve "||" arasındaki fark "AND", "OR" ve "XOR" operatörlerinin, atama operatörlerinden bile daha düşük bir önceliğe sahip olmalarıdır (PHP operatörlerinin tablosuna bakın).

Yorumlayıcının boolean ifadeleri nasıl işlediğini anlamak önemlidir. "||" işlecine sahip ifade ilk (sol) işlenen true değerine sahip olacak veya "&&" operatörlü ifadede ilk işlenen false değerine sahip olacak, ardından ikinci (sağ) işlenen değerlendirilmeyecektir. Bunun nedeni, bu gibi durumlarda nihai sonucun artık değişmeyeceğidir (bkz. Tablo 1) ve bu nedenle ikinci işlenenin kodunu işlemekle zaman kaybetmeye gerek yoktur. Ancak, programın doğru çalışmasının bağlı olabileceği doğru işlenene kod koymamaya dikkat etmelisiniz.

Mantıksal operatörlerin kullanımı örnek 2'de gösterilmiştir.

yanlış $ a = 0 || yanlış; // Şimdi $ a == doğru, çünkü 5-> true ve 8-> true $ a = 5 & // Şimdi $ a == false, çünkü "0" -> false $ a = "0" & ​​// Şimdi $ a == true $ a =! False; // Şimdi $ a == yanlış, çünkü 5-> gerçek $a =!5; / * şöntler nedeniyle foo () işlevi çağrılmayacak * / $ a = (false && foo ()); $ b = (doğru || foo ()); $ c = (yanlış ve foo()); $ d = (doğru veya foo ()); / * Fark "||" "veya"dan ve "&&"den "ve"den * / // ($ a = (yanlış || doğru)) $ a = yanlış || doğru; // (($ a = false) veya true) gibi davranır $ a = false veya true; // ($ a = (yanlış && doğru)) $ a = yanlış & // gibi davranır (($ a = yanlış) ve doğru) gibi davranır $ a = yanlış ve doğru; // Şimdi $ a == 5, (($ a = 5) xor 0) $ a = 5 xor 0; // Şimdi $ a == 5, (($ a = 5) ve 0) gibi davranır $ a = 5 ve 0; // Şimdi $ a == 5, (($ a = 5) veya 0) gibi davranır $ a = 5 veya 0; // Şimdi $ a == true, ($ a = (5 || 0) gibi davranır $ a = 5 || 0; // Şimdi $ a == false, ($ a = (5 && 0) gibi davranır $ a = 5 & // Şimdi $ a == true, ($ a = (5 xor 6)) gibi davranır $ a = (5 x veya 6); ?>

Örnek 2. Boole Operatörlerini Kullanma

Bu nedenle, belirli bir koşulu karşılayan kodun nasıl yürütüleceğini zaten biliyoruz. Ancak bu noktaya kadar sadece bir koşul olabilir. Ancak, aynı anda birkaç koşul karşılandığında kodun yürütülmesi gerekiyorsa ne olur?

Bu sorunu çözmek için mantıksal operatörler vardır:

= 5 && $ fiyat<= 10) echo "Это число находится между 5 и 10"; ?>

&& operatörü, aynı zamanda mantıksal VE, sol ve sağdaki değerleri bir boole türüne dönüştürür ve ardından kendisi bir boole değeri döndürür: sol ve sağ doğruysa true veya koşullardan biri yanlışsa false.

Başka bir deyişle, her iki koşul da doğruysa, && operatörü true değerini döndürür. Operatörün adının yansıttığı şey budur.

Operatör || veya mantıksal VEYA iki koşuldan en az biri doğru olduğunda true değerini döndürür:

5 || 1> 2) echo "Koşul karşılandı."; ?>

Yukarıdaki kodda, koşullardan biri doğru olduğu için echo komutu yürütülecektir.

PHP'deki tüm boole operatörleri

&& ve ve arasında ve ayrıca || ve veya küçük bir fark var - yürütme sırası.

Bildiğiniz gibi çarpma toplamaya göre önceliklidir. Bu nedenle, operatörler ve ve/veya operatörleri = atama operatöründen daha düşük önceliğe sahiptir. Sonuç aşağıdaki örnekte görülebilir:

Garip, değil mi? y = daha yüksek bir önceliğe sahip olduğundan, PHP kodu şu şekilde yorumlayacaktır:

($ var = doğru) ve yanlış;

Onlar. önce $ var değişkenini true olarak ayarlar ve ardından değişkenin değerini etkilemediği için mantıklı olmayan bir true ve false işlemi gerçekleşir.

Aşağıda, operatör önceliklerine sahip bir tablo bulunmaktadır. Bazılarıyla zaten tanıştınız. Tablodaki operatör ne kadar yüksekse, önceliği de o kadar yüksek olur.

  • ++ - ~ (int) (float) (string) (dizi) (nesne) (bool) @
  • * / %
  • + - .
  • < <= > >=
  • == != === !== <> <=>
  • ? : (üçlü operatör)
  • = += -= *= **= /= .= %= &= |= ^= <<= >>=

Şimdi karşılaştırma operatörlerinin (==,! =, Etc.) önceliğinin mantıksal operatörlerden daha yüksek olduğunu belirleyebiliriz. Bu bilgi, görevi tamamlamamız için faydalı olacaktır.

Koşul tabanlı dallanma yapıları oluşturmak için iki ana ifade if ve switch'dir. En yaygın kullanılanı, koşullu atlama yapılarında kullanılan if ifadesidir. Öte yandan, belirli durumlarda, özellikle tek bir ifadenin değerine bağlı olarak birçok daldan biri boyunca bir geçiş sağlamanız gerekiyorsa ve bir dizi if ifadesinin kullanılması kodun karmaşıklığına yol açarsa, switch ifadesi daha uygun hale gelir.

Bu operatörleri keşfetmeden önce Boolean ifadelerini ve işlemlerini anlamanız gerekir.

mantıksal işlemler

Boole işlemleri, yeni boole değerleri üretmek için boole değerlerini (doğruluk değerleri de denir) birleştirmenize olanak tanır. Aşağıdaki tabloda gösterildiği gibi, PHP standart Boolean işlemlerini (ve, veya değil ve xor) destekler, ilk ikisinin alternatif sürümleri vardır.

PHP Boole İşlemleri
Operasyon Açıklama
ve Yalnızca ve ancak işlenenlerinin her ikisi de doğruysa sonucu doğru olan bir işlem
veya İşlenenlerinden biri (veya her iki işleneni) doğru bir değer olarak değerlendirilirse, sonucu gerçek bir değer olarak değerlendirilen bir işlem
! Tek işleneni (işlem işaretinin sağında belirtilen) yanlışsa sonucu doğru, işleneni doğruysa yanlış olan bir işlem
xor İşlenenlerinden herhangi biri (ancak ikisi aynı anda değil) doğruysa sonucu doğru olan bir işlem
&& Ve ile aynı, ancak işlenenlerini bundan daha sıkı bağlar
|| veya ile aynı, ancak işlenenlerini bundan daha sıkı bağlar

&& ve || C programcılarına aşina olmalıdır. genellikle değil denir çünkü uygulandığı işlenenin olumsuzlaması olur.

Her iki işlenenin de DOĞRU olup olmadığını kontrol etmek için çift ve işareti (&&) olarak da yazılabilen AND operatörünü kullanın. Hem AND hem de && mantıksal operatörlerdir, tek fark && operatörünün AND operatöründen daha yüksek önceliğe sahip olmasıdır. Aynısı OR ve || operatörleri için de geçerlidir. AND operatörü, yalnızca her iki işlenen de TRUE ise TRUE döndürür; aksi takdirde YANLIŞ döndürülür.

En az bir işlenenin DOĞRU olup olmadığını kontrol etmek için, çift dikey çizgi (||) olarak da yazılabilen VEYA operatörünü kullanın. İşlenenlerden en az biri TRUE ise bu operatör TRUE değerini döndürür.

VEYA operatörünü kullanırken, programda ince mantık hataları görünebilir. PHP, ilk işlenenin DOĞRU olduğunu tespit ederse, ikinci işlenenin değerini değerlendirmeyecektir. Bu, yürütme süresinden tasarruf sağlar, ancak programın doğru çalışmasına bağlı herhangi bir kodu ikinci işlenene koymamaya dikkat etmelisiniz.

XOR operatörü, işlenenlerden yalnızca birinin DOĞRU olup olmadığını kontrol etmenize olanak tanır (ancak ikisi birden değil). Bu operatör, işlenenlerden yalnızca biri TRUE ise TRUE değerini döndürür. Her iki işlenen de TRUE ise, operatör FALSE döndürür.

Genellikle ünlem işareti (!) olarak yazılan NOT operatörünü kullanarak bir Boolean değerini tersine çevirebilirsiniz. İşlenen YANLIŞ ise TRUE, işlenen DOĞRU ise YANLIŞ döndürür.

Aşağıdaki tablo bazı boolean ifadeleri ve bunların sonuçlarını göstermektedir:

Karşılaştırma işlemleri

Aşağıdaki tablo, sayılar veya dizelerle kullanılabilecek karşılaştırma işlemlerini gösterir:

Karşılaştırma işlemleri
Operasyon İsim Açıklama
== eşittir İşlenenleri birbirine eşitse sonucu doğru, aksi takdirde yanlış olan bir işlem
!= Eşit değil İşlenenleri birbirine eşitse sonucu yanlış, aksi takdirde doğru olan bir işlem
< daha küçük Sol işlenen sağ işlenenden küçükse doğru bir değer olarak değerlendirilen, aksi halde yanlış olarak değerlendirilen bir işlem
> Daha Sol işlenen sağ işlenenden büyükse doğru bir değer olarak değerlendirilen, aksi halde yanlış olarak değerlendirilen bir işlem
<= Küçük veya eşit Sol işlenen, sağ işlenenden küçük veya ona eşitse doğru bir değer olarak değerlendiren, aksi takdirde yanlış olarak değerlendiren bir işlem
>= Daha fazla veya eşit Sol işlenen, sağ işlenenden büyük veya ona eşitse doğru bir değer olarak değerlendiren, aksi takdirde yanlış olarak değerlendiren bir işlem
=== aynı Her iki işlenen de birbirine eşitse ve aynı türdeyse sonucu doğru, aksi halde yanlış olan bir işlem

Çok yaygın bir hata yapmamaya dikkat etmelisiniz - atama (=) operatörünü karşılaştırma (==) operatörüyle karıştırmayın.

Operasyonların önceliği

Tabii ki, işlem sırasının esas olarak öncelik kurallarının kullanılmasından kaynaklandığı programlama stilini aşırı kullanmamalısınız, çünkü bu tarzda yazılan kod daha sonra çalışacaklar için zordur, ancak unutulmamalıdır ki, karşılaştırma işlemler mantıksal işlemlerden daha yüksek önceliğe sahiptir. Bu, aşağıdaki gibi bir kontrol ifadesine sahip bir ifadenin

PHP Kodu $ var1 = 14; $ var2 = 15; if (($ var1< $var2) && ($var2 < 20)) echo "$var2 больше $var1 но меньше 20";

olarak yeniden yazılabilir

PHP Kodu ... if ($ var1< $var2 && $var2 < 20) ...

If - else ifadesi

Talimatlar Eğer bu ifadedeki koşullu ifade TRUE ise bir kod bloğunun yürütülmesine izin verir; aksi takdirde kod bloğu yürütülmez. Herhangi bir ifade, sıfır olmayan değer, eşitlik, NULL içeren değişkenler ve fonksiyonlar tarafından döndürülen değerler için testler dahil olmak üzere bir koşul olarak kullanılabilir.

Koşul yan tümcesini oluşturan tek tek koşulların önemi yoktur. Koşul doğruysa, küme parantezleri (()) içine alınmış program kodu yürütülür. Aksi takdirde PHP bunu yok sayar ve ikinci koşulu kontrol etmeye devam eder, deyime rastlayana kadar yazdığınız tüm koşulları kontrol eder. Başka, bundan sonra bu bloğu otomatik olarak yürütecektir. else ifadesi isteğe bağlıdır.

if ifadesinin sözdizimi şöyledir:

If (koşullu ifade) (kod bloğu;)

Koşullu ifade DOĞRU olarak değerlendirilirse, bundan sonraki kod bloğu yürütülür. Aşağıdaki örnekte, $ kullanıcı adı değişkeni "Yönetici" ise, bir karşılama mesajı görüntülenecektir. Aksi takdirde, hiçbir şey olmaz:

PHP Kodu $ kullanıcı adı = "Yönetici"; if ($ username == "Yönetici") (echo "Yönetici sayfasına hoş geldiniz.";)

Bir program kodu bloğu yalnızca bir komut içeriyorsa, o zaman kaşlı ayraçlar isteğe bağlıdır, yine de, kodun okunmasını ve düzenlenmesini kolaylaştırdıkları için bunları her zaman koymak iyi bir alışkanlıktır.

İsteğe bağlı else ifadesi, koşullu ifade FALSE döndürdüğünde varsayılan olarak yürütülen bir kod bloğudur. else ifadesi, kendi koşullu ifadesine sahip olmadığı için if ifadesinden ayrı olarak kullanılamaz. Yani, else ve if kodunuzda her zaman birlikte olması gerekir:

If ve else ifadeleri $ kullanıcı adı = "yönetici yok"; if ($ username == "Admin") (echo "Yönetici sayfasına hoş geldiniz.";) else (echo "Kullanıcı sayfasına hoş geldiniz.";)

Bloğun başına küme ayracı koyarsanız, if ifadesindeki bir kod bloğunu küme ayracı ile kapatmayı unutmayın. else bloğu, if bloğunda olduğu gibi, açma ve kapama küme parantezlerini de içermelidir.

Bu, arka arkaya birkaç koşulu kontrol etmeniz gerektiği durumlar dışında iyidir. Bunun için talimat uygundur başka türlü... Gerçek bir tane bulunana veya else bloğuna ulaşılana kadar ek koşulları test etmenize olanak tanır. Her elseif ifadesinin, elseif ifadesinin koşullu ifadesinden hemen sonra yerleştirilen kendi kod bloğu vardır. Elseif ifadesi, if ifadesinden sonra ve varsa else ifadesinden önce gelir.

elseif deyimi sözdizimi biraz daha karmaşıktır, ancak aşağıdaki örnek bunu anlamanıza yardımcı olacaktır:

Birden çok koşulu kontrol etme $ kullanıcı adı = "Misafir"; if ($ username == "Admin") (echo "Yönetici sayfasına hoş geldiniz.";) elseif ($ username == "Misafir") (echo "Görüntüleme yok.";) else (echo "Sayfaya hoş geldiniz" kullanıcı. ";)

Burada iki koşul kontrol edilir ve $ username değişkeninin değerine bağlı olarak farklı işlemler yapılır. Ve değişkenin değeri ilk ikisinden farklıysa, hala bir şeyler yapma fırsatı var.

Üçlü operatör ?:

Operatör ?: üç işlenen alan üçlü (üçlü) bir operatördür. Bir if ifadesine benzer şekilde çalışır, ancak iki ifadeden birinin değerini döndürür. Değerlendirilecek ifade koşullu ifade tarafından belirlenir. İki nokta üst üste (:) bir ifade ayırıcı görevi görür:

(şart) ? değerlendirme_if_condition_true: değerlendirme_if_condition_false;

Aşağıdaki örnek, değeri kontrol eder ve değerine bağlı olarak farklı dizeler döndürür (DOĞRU veya YANLIŞ):

Operatörü kullanarak bir mesaj oluşturun ?: $ login_in = DOĞRU; $ kullanıcı = "İgor"; $ banner = (! $ login_in)? "Kayıt olmak!" : "Tekrar hoş geldiniz, $ kullanıcı!"; yankı $ afiş;

Yukarıdaki operatörün aşağıdaki operatöre eşdeğer olduğu oldukça açıktır:

PHP Kodu $ login_in = DOĞRU; $ kullanıcı = "İgor"; if (! $ login_in) ($ banner = "Kaydol!";) else ($ banner = "Tekrar hoş geldiniz, $ kullanıcı!";) echo $ banner;

ifadeyi değiştir

Talimatlar değiştirmek bir ifadeyi birden çok değerle karşılaştırır. Kural olarak, belirli bir kod bloğunun yürütülmesi gereken değerine bağlı olarak bir değişken ifade olarak kullanılır. Örneğin, "EKLE", "DEĞİŞTİR" ve "SİL" değerlerine sahip olabilen $ action değişkenini hayal edin. switch ifadesi, bu değerlerin her biri için yürütülmesi gereken kod bloğunu tanımlamayı kolaylaştırır.

if ve switch deyimleri arasındaki farkı göstermek için, bir değişkeni birden çok değere karşı kontrol edelim. Aşağıdaki örnek, if deyimine dayalı olarak böyle bir kontrolü uygulayan program kodunu ve aşağıdaki örnekte ise switch deyimine dayalı olarak göstermektedir:

Birkaç değerden birine uygunluğun kontrol edilmesi (if ifadesi) if ($ action == "ADD") (echo "Eklemeyi yürüt."; echo "Her bloktaki komut sayısı sınırlı değildir.";) elseif ($ action == "MODIFY") (echo "Değişikliği yürüt. ";) elseif ($ action == "DELETE") (echo "Silme işlemini gerçekleştir.";) Birkaç değerden birine uygunluğun kontrol edilmesi (anahtar ifadesi) switch ($ action) (case "ADD": echo "Eklemeyi yürüt."; echo "Her bloktaki komut sayısı sınırlı değildir."; break; case "MODIFY": echo "Değişikliği yürüt."; break; case "DELETE" : echo "Silme işlemini yürütün."; break;)

switch ifadesi, switch anahtar kelimesinin yanındaki değeri alır ve anahtar kelimelerin yanındaki tüm değerlerle karşılaştırmaya başlar. durum, programda göründükleri sırayla. Eşleşme bulunamazsa, blokların hiçbiri yürütülmez. Bir eşleşme bulunduğunda, ilgili kod bloğu yürütülür. Aşağıdaki kod blokları da yürütülür - switch ifadesinin sonuna kadar veya anahtar kelimeye kadar kırmak... Bu, birkaç ardışık adımdan oluşan bir süreci organize etmek için kullanışlıdır. Kullanıcı bazı adımları daha önce tamamlamışsa işleme kaldığı yerden devam edebilecektir.

Switch ifadesinin yanındaki ifade, sayı veya dize gibi ilkel bir değer döndürmelidir. Bir dizi, yalnızca temel tür değerine sahip ayrı bir öğe olarak kullanılabilir.

Varsayılan seçim

Koşullu ifadenin değeri case ifadelerinde sunulan seçeneklerden herhangi biriyle eşleşmiyorsa, switch ifadesi bu durumda if, elseif, else yapısının else ifadesine benzer bir şey yapmanıza izin verir. Bunu yapmak için seçim listesindeki son seçenek olarak bir talimat yapmanız gerekir. varsayılan:

Varsayılan Açıklamayı Kullanarak Hata Mesajı Oluşturma $eylem = "KALDIR"; switch ($ action) (case "ADD": echo "Eklemeyi yürüt."; echo "Her bloktaki komut sayısı sınırlı değildir."; break; case "MODIFY": echo "Değişikliği yürüt."; break; case "DELETE" : echo "Execute delete."; break; default: echo "Hata: $ action komutu geçerli değil". "Sadece ADD, MODIFY ve DELETE komutları kullanılabilir.";)

Alışılmış olana ek olarak, switch ifadesi alternatif bir sözdizimini destekler - bir anahtar kelime yapısı anahtar / uç anahtarı küme parantezleri yerine bir ifadenin başlangıcını ve sonunu tanımlayan:

switch ifadesi, endwitch anahtar kelimesiyle biter switch ($ action): case "ADD": echo "Eklemeyi yürüt."; echo "Her bloktaki komut sayısı sınırsızdır."; kırmak; case "DEĞİŞTİR": echo "Değişikliği yürüt."; kırmak; case "DELETE": echo "Silme işlemini yürütün."; kırmak; varsayılan: echo "Hata: $ eylem komutu geçerli değil". "sadece ADD, MODIFY ve DELETE komutları kullanılabilir."; uç anahtarı;

Yürütme kesintisi

Yalnızca belirli bir değere karşılık gelen bir kod bloğu yürütülecekse, o bloğun sonuna anahtar kelime sonu eklenmelidir. PHP yorumlayıcısı, break anahtar sözcüğüyle karşılaştığında, switch ifadesinin (veya endwitch anahtar sözcüğünün) kapanış küme parantezinden sonraki satıra atlayacaktır. Ancak break ifadesini kullanmazsanız, switch yapısının sonraki durum dallarında kontrol devam eder. Aşağıda bir örnek gösterilmiştir:

Break ifadeleri olmadığında ne olur? $ action = "SİPARİŞ OLUŞTUR"; switch ($ action) (case "SİPARİŞ TOPLA": echo "Siparişi topla.
"; case" PAKET ": echo" Paket.
"; case" SHIP ": echo" Müşteriye teslim edin.
"; }

$ action değişkeni "ASSEMBLE SİPARİŞ" olarak ayarlanmışsa, bu snippet'in sonucu aşağıdaki gibi olacaktır:

Siparişi topla. Sarmak için. Müşteriye teslim edin.

Oluşturma aşamasının zaten geçildiğini ve $ action değişkeninin "PACKAGE" değerine sahip olduğunu varsayarsak, aşağıdaki sonuç elde edilir:

Sarmak için. Müşteriye teslim edin.

Bazen, sipariş aşamalarının oluşturulduğu yukarıdaki örnekte olduğu gibi break ifadelerinin olmaması yararlıdır, ancak çoğu durumda bu ifade kullanılmalıdır.

Veri türleri Döngüler 1 2 3 4 5 6 7 8 9 10

PHP standart mantıksal operatörler AND ve &&, OR ve || ,! (değil) ve XOR. Boole operatörleri, birinin veya her ikisinin de doğru mu yoksa yanlış mı döndürdüğünü belirlemek için iki işlenenin (değerler veya ifadeler) sonuçlarını karşılaştırmanıza ve döndürülen değere göre komut dosyasının uygun devamını seçmenize olanak tanır. Karşılaştırma operatörleri gibi, mantıksal operatörler de operatörün her iki tarafındaki değerlere bağlı olarak bir Boole değeri döndürür - doğru veya yanlış.

Mantıksal VEYA (VEYA ve ||)

Mantıksal VEYA operatörü, VEYA veya || ... İki işlenen üzerinde mantıksal bir VEYA işlemi gerçekleştirir. İşlenenlerden biri veya her ikisi doğruysa, true değerini döndürür. Her iki işlenen de yanlışsa, yanlış döndürür. Muhtemelen bir sorunuz var, neden bir operatörün iki versiyonunu yaptınız? "Mantıksal VEYA" operatörünün iki farklı varyantının amacı, farklı önceliklere göre çalışmalarıdır.

Önce || operatörünün nasıl çalıştığına bakalım. ... Ve böylece, işlenenlerinden biri veya her ikisi doğruysa, true değerini döndürür. Her iki işlenen de yanlış değerler döndürürse, false döndürür.

VEYA operatörü || ile aynı şekilde çalışır. bir istisna dışında, OR operatörü bir atama ile kullanılıyorsa, önce sol işlenenin değerini değerlendirir ve döndürür, aksi takdirde || operatörü gibi çalışır. , yani işlenenlerinden biri veya her ikisi doğruysa, true değerini döndürür. Her iki işlenen de yanlış değerler döndürürse, false döndürür.

Nasıl çalıştıklarını daha açık hale getirmek için aşağıdaki örneği verelim:

1 // Önce değişkene false değeri atanır ve ardından ikinci işlenen hesaplanır // Öncelikli eylem: ($ var2 = false) veya true $ var2 = false veya true; yankı $ var2; // false görüntülenmez // ($ var3 = 0) veya 3 $ var3 = 0 veya 3; Eko "
$ var3 "; // => 0?>

Herhangi bir karşılaştırma ve mantıksal operatör, daha karmaşık yapılarda birleştirilebilir:

Hem OR hem de || ile ilgili bahsetmeye değer bir başka önemli nokta daha var. ... "Mantıksal VEYA" operatörü, hesaplamalarına sol işleneninden başlar, doğru dönerse sağ işlenen değerlendirilmez. Bu, yürütme süresinden tasarruf sağlar, ancak programın doğru çalışmasının doğru işlenene bağlı olabileceği kodu koymamaya dikkat etmeniz gerekir.

Mantıksal VE (VE ve &&)

Mantıksal AND operatörü, AND veya && olarak adlandırılır. İki işlenen üzerinde mantıksal bir AND işlemi gerçekleştirir. Yalnızca ve ancak her iki işlenen de doğruysa true değerini döndürür. İşlenenlerden biri veya her ikisi de false döndürürse, operatör false döndürür. "Mantıksal AND" operatörünü yazmanın iki farklı varyantının anlamı, önceki iki operatörle aynıdır, yani farklı önceliklere göre çalışırlar.

Öncelikle && operatörünün nasıl çalıştığına bir göz atalım. Ve böylece, her iki işlenen de doğruysa, true değerini döndürür. İşlenenlerinden en az biri veya her ikisi false döndürürse, false döndürür.

AND operatörü, bir istisna dışında && operatörü gibi çalışır, AND operatörü bir atama ile kullanılıyorsa, önce sol işlenenin değerini değerlendirir ve döndürür, aksi takdirde && operatörüyle aynı şekilde çalışır. İşlenenlerinden en az biri false döndürürse, aynı zamanda false döndürür, ayrıca her iki işlenen de false değerleri döndürürse false döndürür.

Anlamak için şimdi bunun pratikte nasıl çalıştığını düşünelim:

$ bar3 "; // => 9?>

Özel VEYA (XOR)

Özel VEYA operatörü XOR olarak gösterilir. İşlenenlerden yalnızca biri doğruysa true değerini döndürür. Her iki işlenen de doğruysa, operatör false döndürür.

XOR operatörünün önceliği AND ve OR operatörlerininkiyle aynı olduğundan (atama operatöründen daha düşük) ve bir atama ifadesinde kullanıldığından, önce sol işlenenin değerini değerlendirir ve döndürür.

6 $ a1 = 19 x veya 5> 6; var_dump($ a1); // => 19 var_dump (doğru x veya doğru); // yanlış var_dump ((2< 3) xor (5 != 5)); // true ?>

Mantıksal DEĞİL(!)

Operatör mantıksal DEĞİL, aynı zamanda işaretiyle gösterilen olumsuzlama olarak da adlandırılır! ... Tek bir işlenenden önce yerleştirilmiş tekli bir operatördür. Boolean NOT operatörü, işleneninin boole değerini tersine çevirmek için kullanılır ve her zaman true veya false döndürür.

Bir ifadenin değerini ters çevirmeniz gerekiyorsa, örneğin a && b, parantez kullanmanız gerekir:! (A && b). Ayrıca operatörün yardımıyla! operatörünü kullanarak herhangi bir x değerini mantıksal eşdeğerine dönüştürebilirsiniz: !! x iki kez.

>> Bu yanıtlardan birkaçını okudum ve dürüst olmak gerekirse " || "ve" OR "operatörleri arasındaki farkları açıklayan bir yanıt bulamadım.

Fark, operatör önceliğine ilişkin bağlantıda açıklanmıştır.

"||" operatörler atamadan ("=") önce değerlendirilirken, "veya" operatörleri atamadan sonra değerlendirilir. İkinci örneğinizde PHP'ye önce "(choice1! = False?" Hah ":" boo ")" sonucunu $ val'e, ardından "veya" ifadesinin geri kalanına atamasını söylüyorsunuz. Aşağıdaki örneği deneyin, ne demek istediğimi anlayacaksınız (önceliği zorlamak için fazladan parantezlere dikkat edin):

tanımla ("seçim1", yanlış);
tanımla ("seçim2", "köpek");
define ("varsayılan1", "diğer");
$ değer = dizi ();

$ val ["Test 1"] = (seçenek1! = yanlış? "hah": "boo") || (seçim2! = yanlış? "hah2": "boo2") || (default1! = false? "hah3": "boo3");
$ val ["Test 1b"] = ((seçenek1! = yanlış? "hah": "boo") || (seçenek2! = yanlış? "hah2": "boo2") || (varsayılan1! = yanlış? "hah3 ":" boo3 "));
$ val ["Test 2"] = (seçenek1! = yanlış? "hah": "boo") veya (seçim2! = yanlış? "hah2": "boo2") veya (varsayılan1! = yanlış? "hah3": " bo3");
$ val ["Test 2b"] = ((seçenek1! = yanlış? "hah": "boo") veya (seçim2! = yanlış? "hah2": "boo2") veya (varsayılan1! = yanlış? "hah3": "boo3"));

Foreach ($ val as $ testi => $ sonuç) (
yazdır ("$ testi:"); var_dump ($ sonuç); Yazdır "
\ n
\ n ";
}
?>

hto dot com'da test edin

Çünkü bir if bloğunun VEYA kısayolu daha fazlasını üretebilir.
daha az yazarak okunabilir kod, başarısızlık durumunda FALSE veya başarı durumunda başka bir veri türü döndürecek işlevler üretmek caziptir. "Başarı durumunda MySQL bağlantı tanımlayıcısı veya başarısızlık durumunda FALSE döndüren" mysql_connect gibi.

Acemi php php geliştiricisi, tamsayının sıfır olma olasılığı varsa, başarısızlık durumunda YANLIŞ ve başarı durumunda bir tamsayı üretebilecek işlevler oluşturmaktan kaçınmalıdır.

falan falan filan;
$ i = give_me_liberty() veya öl ("ÖLÜMCÜL DB HATASI!");
falan falan filan;
?>

yahoo dot com'da ironmo67

PHP ve Perl arasında biraz sinir bozucu bir fark keşfetti:


if (! bazı_işlev ()) false döndürür;
?>

daha güzel olarak yeniden yazılamaz:

işlev bazı_işlev () (yanlış döndür;)
bazı_işlev () veya false döndür;
?>

Ancak aşağıdakiler işe yarayacaktır:

işlev bazı_işlev () (yanlış döndür;)
bir işlev () veya ölme ();
?>

Nedenini tahmin edebilir misin? Basitçe, die () bir işlevdir ve "dönüş" bir ifadedir (print () ile yankı arasındaki fark gibi). Bu gerçekten çok kötü çünkü if (!) () Sürümünü yorgun ve okunamaz buluyorum, ama hey, if (some_c_function == 0)'dan (bir şeyler yap) daha iyi.

&, | ve ^ mantıksal operatörler * değildir * değildir. Bu yüzden bu sayfada listelenmiyorlar. "Sayıların ikili biçimleri üzerinde hareket eden operatörlerdir. Mantıksal değerleri (yani," true "veya" false ") önce sırasıyla 1 ve 0 sayılarına dönüştürmeden bağımsız değişken olarak almazlar. Mantıksal olarak da dönmezler. Tabii ki, daha sonra bu sayılara mantıksal değerlermiş gibi davranabilirsiniz (bu durumda 0 "yanlış"a ve diğer her şey "doğru"ya dönüştürülür), ancak bu "PHP'nin bir sonucu" " s tipi döküm kuralları ve operatörlerin davranışı ile ilgisi yoktur.

Mantıksal işlemler istiyorsanız, mantıksal işleçleri kullanın; bit düzeyinde işlemler istiyorsanız, bit düzeyinde operatörler kullanın ... birini diğeri için kullanmak işleri zorlaştırmanın iyi bir yolu gibi görünüyor.

hotpop dot com'da kws_

"Yapabiliyor olman, yapman gerektiği anlamına gelmez."

Ayrıca, kısa devre değerlendirmesini atlatmanın ve koşullu ifadelerde yan etkilere güvenmenin kötü bir üslup kullanmak olduğunu hissediyorum. Açık ve anlaşılır yapılar kullanarak kendini belgeleyen kod yazmak, bana karmaşık ve okunması zor bir ifade kullanmaktan ve bunu yorumlarla açıklamaktan (veya daha kötüsü, hiç belgelememek!) çok daha iyi bir uygulama gibi geliyor. bilgisayardan çok programcının gözü için yazılmasıdır.

Bitsel operatörleri mantıksal bir bağlamda kullanmak okuyucunun beklentilerini ihlal edebilir ve bitsel operatörler bit alanı işlenenlerini ifade ettiğinden kafa karışıklığına neden olabilir.

Ayrıca, mantıksal işleçler amaçları için kullanıldığında, kısa devrenin * ARE * mantıksal yaptığı varsayımlar olduğundan, kısa devre değerlendirmesinin mantıksal yapılar için en iyisi olduğunu varsaymanın derleyici "hakları" dahilinde olduğunu düşünüyorum. (bir kez daha, doğru kullanıldığında) mantıksal ifadelerin değerlendirmesini optimize eder.

Herhangi bir kişiyi doğrudan alevlendirmek veya aşağılamak değil, yalnızca kötü stil kullanımını caydırmak ve yeni (ve hatta bazı deneyimli) programcıları açık ve ayrıntılı kod yazmaya ve programcılar hakkında düşünmeye teşvik etmek değil. yarattıklarınızı deşifre etmeye çalışabilecek bilgisayarlar.

Beyin trenine cevap olarak:

Getirdiğiniz ikinci örnek, bunu yapmanın doğru yolu! Hiç de karmaşık bir mantık değil, belirsiz yan etkilere güvenmeyerek kodunuzu okunabilir kılan şey budur !! Okuması ilkinden çok daha kolaydır ve bakımı çok daha kolaydır.

Bir CheckThisOrOther () işlevinin yalnızca kullanıcıya bilgi yankılanmasına izin verme fikri için, kodlama lisansınızdan sıyrılmanız gerekir. Senaryolarını sürdürmek zorunda kalsaydım, senden nefret etmem gerekirdi.

Bu, kulağa geldiği gibi alevle vurma anlamına gelmez! Kaynak kod bilgisayarların çalışması için değil, kodlayıcıların okuması için yazılır! Bunu kalpten tutun ve iş arkadaşlarınız bunun için size teşekkür edecek!

beyin zarı

Shadedecho'nun hem OR ifadesinin değerlendirmesini zorlamaya yönelik gönderisi, aslında tam olarak kısa devre optimizasyonunu bastırmak için yapılması gereken şey.

Derleyicinin herhangi bir değerlendirmeyi kısa devre yapmasını istemediğiniz birçok durum vardır, özellikle de bir ve/veya durum yapmak istediğinizde. Kısa devre değerlendirmesi bir VEYA işlemi yapar ama bir VE/VEYA işlemi yapmaz !!!

Örneğin, kullanıcının herhangi bir girişi yanıtlamayı kaçırıp kaçırmadığını VE/VEYA kullanıcı aynı yanıtı birden fazla giriş için çoğaltmış olup olmadığını görmek için kullanıcının sorgu formunu kontrol etmek istersem, formu geri göndermem gerekir. Müşteri, düzeltilmesini istediğim şeyi bildiriyor.

İşlev BazıAnswersAreMissing ()
{
...
echo "Hata! Bazı soruları yanıtlamayı kaçırdınız.";
DOĞRU döndür;
}

İşlev SomeAnswersAreDuplicated ()
{
...
echo "Hata! İkisine de aynı şekilde cevap verebilirsiniz.";
DOĞRU döndür;
}

If (SomeAnswersAreMissing () || SomeAnswersAreDuplicated ())
SendFormAgain();

Bunu yaparsam, her ikisi de doğru olsa bile, kullanıcı yalnızca eksik yanıt uyarısını görür, yinelenen yanıt uyarısını görmez. Bu, kullanıcı için bilgilendirici değildir, çünkü yanlış yaptığı her şeyi fark etmeden önce formu iki kez yeniden göndermesi ve hack'lemeyi engellemesi gerekecektir. Bu kullanıcı dostu değil.

If (SomeAnswersAreMissing () | SomeAnswersAreDuplicated ())
SendFormAgain();

Daha sonra her iki uyarı mesajı da aynı anda gönderilir ve kullanıcı bunu tek bir yeniden gönderme ile düzeltebilir.

Teşekkürler shadedecho, derleyicinin aptal kısa devre optimizasyonunu geçersiz kılmanın bir yolunu arıyordum. Bilgisayar kısa devrenin en iyisi olduğunu varsayamaz :(

BTW, elbette şunları yapabilirsiniz:

$ you_made_a_mistake = yanlış;

Eğer (Bazı Cevaplar Eksik ())

if (SomeAnswersAreDuplicated ())
$ you_made_a_mistake = doğru;

Eğer ($ you_made_a_mistake)
SendFormAgain();

Ama bu dolambaçlı bir mantık !!!

hoplamak

Sevgili Acemi,

("deneyimli programcıların kafasında bu tür fikirlerin ortaya çıktığını görmediğim için" ...)

Lütfen shadowdecho'nun 14-Mart-2003 04:02 tarihli gönderisine dikkat etmeyin! Sadece çok kötü bir programlama uygulaması olmakla kalmayıp, aynı zamanda düşündüğü optimizasyonu da sağlayamayan belirsiz yan etkilere büyük ölçüde güveniyor.

Bunu yapmanın doğru yolu


yankı $a;
}

Shadedecho'nun istediği gibi çalışmak (bir bütün olarak örnek oldukça yetersiz olsa da):

$a = falan();
$a = falan2();

Eğer ($ a) (echo $ a;)

Size bağlantı verdiği tartışmayı okursanız, iki farklı db tablosundan tüm farklı girişleri gerçekten almak istediğini göreceksiniz. Orada bile yanılıyor. Bunu yapmanın doğru yolu, ilk tabloyu işlemek ve ardından ikinci tabloyu işlemek.
Bu, "|" ile yapılan geçici çözümden yalnızca çok daha okunabilir olmakla kalmaz, aynı zamanda en yavaşı da değildir.

gölgelik

Görünüşe göre (çok sinir bozucu ama sonuçta yararlı arama ve tek-tips gibi forumlarda tartışmadan sonra),
|| ve && daha önce belirtildiği gibi "kısa devrelidir" AMA | ve & operatörleri (PHP tarafından bitsel operatörler olarak belgelenmiştir) sırasıyla onların kısa devre yapılmayan karşı parçaları gibi davranır.

İşlev falan () (
yankı "merhaba< br>";
"blah'tan () dönüş< br>";
}

İşlev blah2 () (
yankı "dünya \< br>";
blah2'den "dönüş ()< br>";
}

If (($ a. = Blah ()) || ($ a. = Blah2 ())) (
yankı $a;
}

Bu, aşağıdaki çıktıyla sonuçlanacaktır:

Merhaba
filan ()

"World"ün "echo" d almadığına ve "from blah2()" öğesinin $a değişkenine "concat" d almadığına dikkat edin, çünkü $a'ya yapılan ilk atama başarılıydı, bu nedenle "kısa devre" başlar ve boole testi geri kalanını değerlendirmeden sona erer.

ANCAK, eğer || sadece | ile bu "if" ifadesinde şu çıktıyı alırsınız:

Merhaba
Dünya
filan ()
blah2'den ()

Evreka! boole testinin tüm bölümleri, beklenen soldan sağa şekilde ve görebildiğim kadarıyla tüm normal öncelik kurallarına göre değerlendirilir.

Bu tamamen mantıklı ... Bitsel operatörleri kullanarak, bit düzeyinde olmayan iki işlemin (atamalar) sonucu olan bit düzeyinde işlem gerçekleşir. Bitsel olmayan bir işlem null döndürürse (başka bir deyişle, atanan değer null veya 0 olur), bitsel operatör buna "0" olarak bağlanır (veya daha uygun şekilde, onu "görür"), aksi takdirde sıfır olmayan bir (içinde en az bir "1" olan bit dizisi) görürdü.

Sonra biraz | iki değer üzerinde yapılır ve bunlardan biri sıfır değilse ("1" bitleri varsa) o zaman sonuç içinde o "1" bitlere sahip olur (sıfır olmayan) ve if deyimi herhangi bir olmayanı yorumlar. bir boole testinde doğru olarak sıfır değeri. Aynı şekilde, her iki işlenen de | null veya 0 olsaydı, sonuç bir sıfır değeri olurdu ve "if" yanlış olarak yorumlanırdı.

Yukarıdaki if ifadesi bit düzeyinde | (bu durumda) sıfır olmayan iki değerde (bit düzeyinde "1" s ile), bu nedenle | işlemi, if ifadesi tarafından DOĞRU olarak yeniden yorumlanan sıfır olmayan bir değer döndürür!

Bu nedenle, kısa devre olmayan boole testlerini bir araya getirmeye çalıştığınız bu özel durumda, bu operatörler işlenenleri üzerinde bit düzeyinde çalışırlar ve karşılaştırma operatörleri değil matematiksel operatörler oldukları için kısa olamazlar. devreli ve ortaya çıkan davranış, kısa devre olmayan bir "boole testi" dir.

Biliyorum, böyle yerleşik bir optimizasyonu aşmaya çalıştığım için deli olduğumu düşünüyor olmalısın, ama seni temin ederim ki bunun çok iyi bir nedeni var ve eğer ilgileniyorsan, benim gibi bu konuya göz atabilirsin. orada ne yapmaya çalıştığımı açıklayan çok uzun bir yazı:

Bu, optimize etmek istediğim "veritabanı sorgum" hakkındaki açıklamamı bulacağınız 9. gönderi.

Bu muhtemelen istediğin şey değil.

Bu, kodlarının ingilizce gibi okunmasını sevenlere yardımcı olabilir ve bu operatörlerin öncelik farklılıklarının nispeten egzotik olduğunu düşünebilir: bunlar "t.

Bana gelince, bu problemle karşılaştım çünkü sembolik mantıksal XOR yok (örneğin, ^^ yok), bu yüzden XOR kullanmak zorunda kaldım ve sonra benzer yerlerde "VE ve VEYA kullanmam gerektiğini ve sonra benim kod bozuldu :)

Yani şimdi
$ a = ($ b x veya $ c);

Jesse Thompson
bend.com

hotmail dot com'da yohgaki

PHP4'te "ve", "veya", "&&", "||" - hepsi C/C++'daki gibi "kısa devre"dir. PHP3'te, bence değildi.

"Kısa devre", koşullar belirlendiğinde dilin ifade değerlendirmesini durdurması anlamına gelir. (Çoğu dil, mantıksal durum için kısa devre değerlendirmesini kullanır)

$a = doğru;
$b = yanlış;
if ($ a || $ b) (
}

Bu "if" ifadesi yalnızca $ a değerini değerlendirir, çünkü $ a doğrudur ve tüm koşul doğru olmalıdır. (yani, $ b değer yerine bir işlevse, işlev çağrılmaz)

muerte at web-ster dot com

Perl'de || = işlevlerine benzer bir operatör bulmayı umuyordum. İlk düşüncem şu olurdu:

$ i = $ i veya "varsayılan"

Ama ya da böyle çalışmıyor. Değişkenlerinize yalnızca önceden atanmamışlarsa varsayılan bir değer atamak istiyorsanız, ancak şunları yapabilirsiniz:

$ i veya $ i = "varsayılan"

İlk örnek ÇALIŞMAZ çünkü veya operatörü Perl'deki gibi aşırı yüklenebilir değildir.

dante at Hearme dot com


Böyle bir şey yapmak istedim:

$ seçim1 = "";
$ seçim2 = "köpek";
$ default = "diğer";
$ değer = $ seçim1 || $ seçim2 || $ varsayılan;

Ama sonra $ val1 sadece 1 veya 0 içerecektir. Bunun yerine şunu yaptım:

$ seçim1 = "";
$ seçim2 = "köpek";
$ default = "diğer";
$ val = $ seçim1 veya $ seçim2 veya $ varsayılan;

Şimdi $ val "dog" dizesini içeriyordu. bu "s
"veya"nın "||" den farklı olması garip ... ve ben
"||" olduğunu düşünüyorum idare edecek kadar akıllı olmalı
dizeler ... PERL'nin yaptığı gibi. Sanırım değil. Belki "s
bir tasarım seçimi.