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…