PHP'de üçlü operatörü (?:) “İf / else” için bir kısaltma olarak nasıl kullanırım?


118

Bu sayfadaki örneklere dayanarak, aşağıda çalışan ve çalışmayan kod örneklerine sahibim.

İfade kullanarak çalışma kodu if:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

Üçlü operatör kullanan çalışmayan kod:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

GÜNCELLEME
Brian'ın tavsiyesinden sonra, yankılamanın $testbeklenen sonucu verdiğini gördüm . Aşağıdakiler bir cazibe gibi çalışıyor!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';

4
Doğru görünüyor. $ Testini yankılamayı denediniz mi?
Brian Fisher

Sorunuz bazı gönüllüleri ve araştırmacıları kandırıyor çünkü kısa ve üçlü bir ifade kullanarak ödev yazmıyorsunuz ("Elvis Operatörü" yoktur) - uzun el üçlü bir ifade yazıyorsunuz. Aradaki fark, değerlendirmeye bağlı olarak döndürülen değerlerin ikisini de bildirmenizdir. Kısa bir değerlendirmede, giriş değeri "doğru" ise döndürülür; "yanlış" ise, geri dönüş değeri döndürülür (bu, Elvis Operatöründen sonra bildirilen değerdir). Null Coalescing Operator burada da gözle görülür derecede zayıf bir uygulama var.
mickmackusa

Yanıtlar:


234

The

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

sözdizimi bir "kısaltma if" operatörü değildir ( ? buna koşullu operatör denir) çünkü kodu, yaptığınız gibi aynı şekilde yürütemezsiniz:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

Örneğinizde, echoifadeyi $addressboş olmadığında çalıştırıyorsunuz . Bunu koşullu operatörle aynı şekilde yapamazsınız. Ancak yapabilecekleriniz echo, koşullu işlecin sonucudur:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

ve bu "Sokak boş!" boşsa, aksi takdirde street2 adresini gösterecektir.


İfade ve ifade arasındaki fark bu
pmiranda

2
kısaltma yine nedir? condition ?: falsehangisi doğru conditionolup olmadığını değerlendirir ?
oldboy

44

PHP 7+

PHP 7'den itibaren, bu görev sadece şu şekilde Null birleştirme operatörü kullanılarak gerçekleştirilebilir :

echo !empty($address['street2']) ?? 'Empty';


3
Bilginize, $address['street2']boş bir dizge ise. Kabul edecek ve geri dönmeyecek 'Empty'. isset() != empty(). Bu sadece değer şu ise işe yararnull
AFwcxx

Ben sadece bir örnek verdim. Ama kodu değiştirdim. Teşekkürler !
Rabin Lama Dong

2
$address['street2']Boş değilse çıktı nedir ?
AliN11

$ Adres ['sokak2'] boş değilse, bir tür "doğru" çıktı verir. Yukarıdakilerin olağan biçimi daha çok şuna benzer: echo $address['street2'] ?? 'Empty';ancak belirtildiği gibi, bu " boş birleştirme operatörü" olduğundan boş değil, sadece boş için test eder. Bunun nedeni ise ?? İsset () için bir kısaltmadır.
Brian C

1
Yalnızca bu yanıta olumsuz oy vermek için oturum açtım. Bu, reklamı yapılan hiçbir şeyi yapmaz.
TKoL

28

Temel Doğru / Yanlış Beyanı

$is_admin = ($user['permissions'] == 'admin' ? true : false);

Koşullu Hoş Geldiniz Mesajı

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Koşullu Öğeler Mesajı

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

ref: https://davidwalsh.name/php-ternary-examples


2
kısa el web sitesinden aldınız ve referans bile
Richard

1
@Richard referanslar ekledi
Arun Yokesh

Bu mu ? StackOverflow bağlamında her zaman ince bir çizgidir, yani Q bir şey istedi, kendisi bulamadı ve sonra başka biri bu içeriği iletti. Bu Soru / Cevap'a yardımcı oluyorsa ve değer katıyorsa mevcut içeriği kopyalamak haksızlık mıdır? StackOverflow'daki yanıtların "kendi içeriğiniz" olmadığını düşünüyorum ... hmmm
Sliq

İlk örnek yanlıştır. )Yanlış olduğu. Bu önceliği olduğu ?. Tam açıklama$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

Üçlü operatör, if / else bloğu için yalnızca bir kısaltmadır. Çalışma kodunuzun başka bir koşulu yoktur, bu nedenle bunun için uygun değildir.

Aşağıdaki örnek işe yarayacaktır:

echo empty($address['street2']) ? 'empty' : 'not empty';

6

Aradığınız Ternary operatörü, yani Elvis operatörü (google it: P).

echo $address['street2'] ?: 'Empty'; 

Değişken boşsa, değişkenin değerini veya varsayılanı döndürür.


@Structed Söylediklerinize katılamıyorum ama bunun için Google'da arama yapmak size uygun bir sonuç verecek ve hatırlatması daha kolay bir terim
Keyboard ninja

4

O Not iç içe koşullu operatörlerini kullanırken, parantez kullanmak isteyebilirsiniz olası sorunlardan kaçınmak için!

Görünüşe göre PHP, en azından Javascript veya C # ile aynı şekilde çalışmıyor.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

Javascript ve C #'daki aynı kod, her iki durumda da "Olağanüstü" sonucunu döndürür.

İkinci durumda, PHP'nin yaptığı şeydir (veya en azından benim anladığım şey budur):

  1. olduğunu $score > 10? Evet
  2. olduğunu $age > 10? hayır, bu nedenle mevcut $age > 10 ? 'Average' : 'Exceptional'"Olağanüstü" sonucunu döndürür
  3. daha sonra, sadece tüm ifadeyi durdurup 'Olağanüstü' olarak dönmek yerine, bir sonraki ifadeyi değerlendirmeye devam eder
  4. 'Exceptional' ? 'Horrible' : 'Average''Olağanüstü' doğru olduğundan , sonraki ifade 'Korkunç' döndürür olur

Belgelerden: http://php.net/manual/en/language.operators.comparison.php

Üçlü ifadeleri "yığmaktan" kaçınmanız önerilir. Tek bir ifadede birden fazla üçlü operatör kullanıldığında PHP'nin davranışı açık değildir.


3

Hızlı ve kısa yol:

echo $address['street2'] ? : "No";

İşte bir veya daha fazla çeşitli koşullara sahip bazı ilginç örnekler.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

Koşullu Hoş Geldiniz Mesajı

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

İç içe geçmiş PHP Steno

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

2

Sen değiştirerek bu daha da kısa yapabilir echoile<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

Bu, özellikle bir gezinti çubuğunun içinde menü seçeneğinin zaten ziyaret edilmiş (tıklanmış) olarak görüntülenip görüntülenmeyeceğini belirlemek istediğinizde kullanışlıdır:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>


Bu <? =?> Yönteminde () 'ye ihtiyaç var mı?
curls

0

Parantezleri yanlış kullandığınızı düşünüyorum. Bunu dene:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

Çalışması gerektiğini düşünüyorum, ayrıca şunları da kullanabilirsiniz:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

0

Sanırım php'de muhtemelen üçlü operatör kullanmamalısınız. Bir sonraki örneği ele alalım:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

Sizce hangi $adeğişken içerecek? (ipucu: dos) $fooDeğişken 2'ye atansa bile aynı kalacaktır .

İşleri daha iyi hale getirmek için ya bu operatörü kullanmayı reddetmeli ya da aşağıdaki şekilde sağ kısmı parantezlerle çevrelemelisiniz:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

0

Üçlü Operatör temelde if / else ifadesinin kısaltmasıdır. Birkaç satır kodu azaltmak ve okunabilirliği artırmak için kullanabiliriz.

Kodunuz bana daha temiz görünüyor. Ancak aşağıdaki gibi daha temiz bir yol ekleyebiliriz:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

Diğer yol-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

Not- Tam ifadeyi daha temiz hale getirmek için parantez ekledim. Bunu genellikle okunabilirliği artırmak için yapardım. PHP7 ile Null Coalescing Operator / php 7 kullanabiliriz? daha iyi bir yaklaşım için operatör . Ama ihtiyacın uymuyor.


-1

Bir de steno üçlü operatör var ve şuna benziyor:

(deyim1):? ifade2 dönecektir deyim1 zaman gerçek olup olarak değerlendirilirse ifade2'nin aksi.

Misal:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

dönecek

Apples are great!

PHP 5.3'ten beri, üçlü operatörün orta kısmını dışarıda bırakmak mümkündür. İfade ifade1?: İfade3, ifade1 DOĞRU olarak değerlendirilirse ifade1'i, aksi takdirde ifade3'ü döndürür.

Gönderen PHP Manual

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.