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…