Selam arkadaşlar, bol bol okumaya ve öğrenmeye devam ediyoruz.
PHP 5.5 ile gelen bir başka yenilikte sıra; Finally kavramı..
Bundan 2 önceki makalemde size sınıf ve metodlar için final kavramından bahsetmiştim, onlar ile karıştırmayın.. Bu Try & Cache ailesine katılan küçük kardeş. Artık ekip üçledi…
İşin özü finally bizim için nolursa olsun işle bunu yap anlamına çıkıyor.
(S.S. yapılacak.. seve seve… yani bi şekilde yap )
Bu sefer fazla geyik yaptık belki kafanız biraz bulandı ama örnekler ile toparlanacak kafanızda olay, o yüzden lafı çok uzatmadan konuya gireceğim hatta çok güzel anlatımın yapıldığı bir yazı üzerinden gideceğim. Hemen örnek vermek istiyorum;
<?php try { print "deneyelim\n"; throw new Exception(); } catch (Exception $e) { print "hata oldu\n"; } finally { print "Ben kralım hep çalışırım\n"; } /* Output: deneyelim hata oldu Ben kralım hep çalışırım */
Aslında bu örnek yeterli anlamak için, kısa ve öz ama bir kaç örnek daha vererek hem detaylandırmak hemde pekiştirmek istiyorum…
Şimdi genel exception kullanımı yerine biraz daha özelleştirelim durumu:
<?php // Runtime Exception aşağıdaki catch-blokları tarafından yakalanmaz try { print "deneyelim\n"; throw new RuntimeException(); } catch (LogicException $e) { print "hata logic ex \n"; } catch (BadMethodCallException $e) { print "hata bad method call\n"; } finally { print "Ben kralım hep çalışırım\n"; } /* Output: deneyelim Ben kralım hep çalışırım Fatal error: Uncaught exception 'RuntimeException' in finally.php:6 Stack trace: #0 {main} thrown in finally.php on line 6 */
Görüldüğü gibi runtimeexception yakalamadığımız için hata döndürdü bize…
Peki birde finally işlemini fonksiyon içinde yapalım, o zaman hangi sıra ile nasıl dönecek bakalım:
<?php function onur() { try { echo "Deneyelim\n"; throw new RuntimeException("lann!"); } catch (LogicException $e) { echo "Exception: " . $e->getMessage() . "\n"; } finally { print "İçteki finally!\n"; } } try { onur(); } catch (RuntimeException $e) { echo "dıştaki exception: " . $e->getMessage() . "\n"; } finally { echo "Dıştaki finally\n"; } /* Output: Deneyelim İçteki finally! dıştaki exception: lann! Dıştaki finally */
Fonksiyon içinde değer döndürürken davranışları nasıl peki? Bakalım görelim..
<?php function foobar() { try { $a = 42; return $a; } catch (Exception $e) { print "Exception!\n"; } finally { print "Finally!\n"; } return -1; } print foobar() . "\n"; /* Output: Finally! 42 */
Giderek örneklerimizi zorlaştıralım;
<?php function foobar() { try { throw new Exception(); return 1; } catch (Exception $e) { print "Exception!\n"; return 2; } finally { print "Finally!\n"; return 3; } return -1; } print foobar() . "\n"; /* Output: Exception! Finally! 3 */
Gördüğünüz gibi yukardada her daim hatayı yakalayıp mesajını yazdırsa bile en son final bloğuna girmekte…
Kapanışı çoklu fonksiyonlar ile yapmak istiyorum
<?php function bar1() { print "bar1\n"; return 1; } function bar2() { print "bar2\n"; return 2; } function bar3() { print "bar3\n"; return 3; } function foobar() { try { throw new Exception(); return bar1(); } catch (Exception $e) { print "Exception!\n"; return bar2(); } finally { print "Finally!\n"; return bar3(); } return -1; } print foobar() . "\n"; /* Output: Exception! bar2 Finally! bar3 3 */
Açıklayıcı olmuştur umarım, olmadıysa da daha uğraşmayın derim 🙂
Kaynakça: adayinthelifeof
Herkese iyi çalışmalar..
selam
try {
throw new Exception();
return 1;
} catch (Exception $e) {
print “Exception!\n”;
return 2;
} finally {
print “Finally!\n”;
return 3;
}
try blogu icinde throw new Exception(); neden ihtiyac var ?
Süreci ve tüm adımları tek tek görmeniz için 🙂
Yoksa normalde gerek yok böyle bir şeye… Tek tek tüm adımlara girmesini istedim uygulamanın…