PHP'de "OR DIE ()" nasıl çalışır?


99

Bir MySQL veritabanına erişmek için bir php uygulaması yazıyorum ve bir öğreticide, formda bir şeyler söylüyor

mysql_connect($host, $user, $pass) or die("could not connect");

PHP, kalıp parçasını çalıştıracak şekilde işlevin başarısız olduğunu nasıl biliyor? Sanırım bunun "veya" kısmının nasıl çalıştığını soruyorum. Daha önce gördüğümü sanmıyorum.


3
Bir kenara, bu tür bir mantığı gerçek uygulamalarda kullanmayın. Hala bunu kaç öğreticinin yaptığı beni şaşırtıyor.
Eran Galperin

2
Neden kullanmıyorsun? Gerçekten güzel ve okunabilir ...
rkj

11
Bir öğretici için basit ve uygun olabilir, ancak betiğinizin gerçek kullanıcıların önünde böyle bir hata mesajı ile nezaketsiz bir şekilde ölmesini istemezsiniz. Özel bir hata sayfası gösterme (gerçek hatayı belirtmeden!) + Hatayı günlüğe kaydetmek bir zorunluluktur.
Eran Galperin

4
Ben "ya da" dan bahsediyorum, "ölmekten" değil.
Artelius

21
mysql_connect ($ host, $ user, $ pass) veya PrintNiceError ('DatabsaeConnectionError');
matpie

Yanıtlar:


133

İlk ifade geri dönerse true, tüm ifade truebu nedenle ikinci kısım asla çalıştırılmaz.

Örneğin:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Bu nedenle, sorgunuz başarısız olursa, die()ifadeyi değerlendirecek ve betiği sonlandıracaktır.


1
İyi açıklama. PHP'nin bu "ima edilen" dil yapısı biraz tehlikelidir, çünkü yürütüldüğünü düşündüğünüz ancak gerçekten yapılmadığını düşündüğünüz ifadeleriniz olabilir ve bu, bir if bloğunuz varmış gibi açık değildir.
Petruza

6
Buna kısa devre değerlendirmesi denir ve PHP dışındaki dillerde de kullanışlıdır.
Mr Griever

1
Bu arada, VEYA'dan sonra yalnızca tek bir ifade kullanabilirsiniz. Bir blok ifadesi, sözdizimi denetiminde başarısız olur (örneğin, gerçek hata mesajı Ayrıştırma hatası: sözdizimi hatası, beklenmeyen '{' içinde ... olabilir)
Scott Chu

Ve burada with, bunun python'un ifadesi gibi bir tür gelişmiş özellik olduğunu düşünüyordum, aslında sadece boolean bir ifade iken ... hatalar. Lütfen, hatalıysam düzeltin, ancak yaparsanız func_call($file) or die();ve işlev başarısız olursa, komut dosyaları öldüğünde dosya açık kalır.
pedromanoel

@Petruza Çalışabileceği ordurumlarda kullanmak iyi bir uygulama ifmı?
limeandcoconut

32

PHP, orC'ler gibi çalışır ||(tesadüfen PHP tarafından da desteklenir - orsadece daha güzel görünür ve farklı operatör önceliğine sahiptir - bu sayfaya bakın ).

Kısa devre operatörü olarak bilinir çünkü nihai değere karar vermek için yeterli bilgiye sahip olduğunda herhangi bir değerlendirmeyi atlayacaktır.

Eğer örnekte, mysql_connect()döner DOĞRU ardından PHP zaten bütün açıklamada ne olursa olsun DOĞRU değerlendirecek bilir die()etmek evalutes ve dolayısıyla die()değerlendirilmez.

Eğer mysql_connect()döner YANLIŞ PHP bunun evalute devam ediyor ve çalışır böylece bütün deyimi doğru veya yanlış olarak değerlendirmek verip bilmiyor die()- sürecinde senaryoyu biten.

Bu, çalışma şeklinden yararlanan güzel bir numara or.


Kısa devreye ad vermek için +1. "Yan etki" olarak da adlandırılmış olabilir. Die () dönüş koduyla hiç ilgilenmiyoruz, sadece yürütülmesinin etkisini istiyoruz. (Her zaman ölmeyecek ()). Bazı etkiler belirsiz olabileceğinden bu, safçılar arasında her zaman popüler değildir.
mckenzm

ve hepsi bu değil. Ayrıca, ikinci bir şey yapmadan önce bir şeyin kesinlikle işe yaramasını istediğiniz bir şeyleri birleştirmek için de kullanabilirsiniz.
MY1

11

Başkalarının tarif ettiği gibi çalışır.

PHP'de "die" kullanmayın, çünkü bu bir istisna YETERMEZ (Perl'de olduğu gibi). Bunun yerine, normal şekilde düzgün bir şekilde bir istisna atın.

die PHP'ye yakalanamaz ve günlüğe kaydetmez - bunun yerine mesajı nezaketsiz bir şekilde yazdırır ve kimseye bir şey söylemeden veya olayı kaydetme, yeniden deneme vb. herhangi bir fırsat vermeden komut dosyasından hemen çıkar.


-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
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.