PHP: 'veya' talimatı üzerine ifadesi başarısız: yeni bir özel durum nasıl?

3 Cevap php

Burada herkes genellikle bir kalıp () komutu yapıştırılmış 'veya' Önermeler, bilmeli:

$foo = bar() or die('Error: bar function return false.');

Biz böyle bir şey görmek zamanların en:

mysql_query('SELECT ...') or die('Error in during the query');

Ancak, ben deyim nasıl çalıştığını tam olarak bu 'veya' anlayamıyorum.

I) yerine kalıbın (yeni bir durum atmak isterdim, ancak:

try{
    $foo = bar() or throw new Exception('We have a problem here');

Çalışmak, ve ne yapmaz

$foo = bar() or function(){ throw new Exception('We have a problem here'); }

Bunu ben buldum tek yolu bu korkunç düşünce şudur:

function ThrowMe($mess, $code){
    throw new Exception($mess, $code);
}
try{
    $foo = bar() or ThrowMe('We have a problem in here', 666);
}catch(Exception $e){
    echo $e->getMessage();
}

Ancak doğrudan 'veya' deyimi sonra yeni bir özel durum için bir yol var mı?

Veya yapının bu tür (i tüm ThrowMe işlevini liek yok) zorunludur:

try{
    $foo = bar();
    if(!$foo){
        throw new Exception('We have a problem in here');
    }
}catch(Exception $e){
    echo $e->getMessage();
}

Edit: ne istediğim bir kullanımını önlemek için gerçekten olup olmadığını () i yapmak her potansiyel tehlikeli çalışmasını kontrol, örneğin:

#The echo $e->getMessage(); is just an example, in real life this have no sense!
try{
    $foo = bar();
    if(!$foo){
        throw new Exception('Problems with bar()');
    }
    $aa = bb($foo);
    if(!$aa){
        throw new Exception('Problems with bb()');
    }
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i relly prefer to use something like:

try{
    $foo = bar() or throw new Exception('Problems with bar()');
    $aa = bb($foo) or throw new Exception('Problems with bb()');
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#Actually, the only way i figured out is:

try{
    $foo = bar() or throw new ThrowMe('Problems with bar()', 1);
    $aa = bb($foo) or throw new ThrowMe('Problems with bb()', 2);
    //...and so on!
}catch(Exception $e){
    echo $e->getMessage();
}

#But i'll love to thro the exception directly instead of trick it with ThrowMe function.

3 Cevap

or a logical operator, sadece, ve || benzer bulunuyor.

Yaygın hile ve

mysql_query() or die();

sadece iyi yazılmış olabilir

mysql_query() || die();

Burada ne olur "mantıksal veya" operatörü (seçtiğiniz hangisi) ya da işlenen DOĞRU olarak değerlendirilirse olmadığını belirlemek için çalışıyor olmasıdır. Bu işlenen bir mantıksal olarak atamaxs ifadeler olması gerektiği anlamına gelir.

Yani, neden

bar() or throw new Exception();

yasadışı olduğunu çünkü

(boolean)throw new Exception();

yasadışıdır. Özünde, bir özel durum atma işlemi operatör kontrol etmek için bir dönüş değeri oluşturmaz.

Ama işlevi does kontrol operatörü olan (açık bir dönüş değeri FALSE olarak atmalarını NULL dönen fonksiyonu int neden olur) için bir geri dönüş değeri üretmek çağırıyor bir fonksiyonun içinde istisna atma sarmak zaman sizin için çalışır nedeni budur.

Umut olur.

Neden bar() ve bb() istisnalar atmak değil mi? PHP İstisnalar bubble up, yani bar() / bb() çağrı fonksiyonu / yönteminde istisna atmak için gerek yoktur. Bu istisnalar bar() / bb() tarafından atılmış olabilir. Başka bir istisna atmak istiyorum durumda, sadece yapabilirsiniz:

function foo() {
    try {
        $bar = bar();
    } catch (BarException) {
        throw new FooException;
    }
}

Bunun için özel durumlar kullanarak hiçbir nokta gerçekten var olsa da ben, sen son yapısı gibi bir şey kullanmak istiyorsanız düşünüyorum:

$foo = bar();
if(!$foo){
    echo 'We have a problem in here';
}

Yorumlarınız Başına - Sana (if(!$foo) onay olmadan yani) bir tek satırda bunu sanmıyorum, ve ben istisna atma yöntemi oldukça korkunç olduğunu kabul ediyorsunuz. Şahsen, ben belirginliği tercihim:

$foo = bar();
if(!$foo){
    throw new Exception('We have a problem in here');
}

ama bu kişisel bir tercihtir. Eğer tek satır bir şey istiyorum, ben size istisna atma fonksiyonu seçeneği ile gitmek gerekir düşünüyorum.

Ben bu sınırlama muhtemelen aşağı PHP'nin dinamik yazarak şeyler için sanırım, bir koşullu bir işlev çağrısının sonuçlarını döküm, ancak bir throw değil sonuçları.