PHP OOP

PHP içerisinde yer alan OOP veya Nesne Yönelimli Programlamada kullanılan anahtar kelimeler örneklerle yer alıyor.

OOP nedir?

OOP (Object Oriented Programming) veya NYP (Nesne Yönelimli Programlama) bir yazılım geliştirme paradigmasıdır.

Neden OOP?

Yazılımlar geliştikçe karmaşıklaşır ve boyutları artar.

Karmaşıklık ve boyutun artmasıyla birlikte kodun bakımı, karmaşıklık ve boyuta göre daha fazla artar.

OOP geliştirilen yazılımın karmaşıklık ve bakım maliyetini azaltmak için kullanılır.

OOP bakım maliyetini azaltırken, kodun tekrar kullanılabilirliğini, anlaşılabilirliğini de arttırmaktadır.

Yazılım geliştirme yöntemi OOP destekleyen bir yazılım dili tarafından öğrenildiğinde diğer OOP destekli dilleri öğrenmeyi ve geliştirme yapmayı kolaylaşacaktır.

OOP tekniği, uzun süredir C++, JAVA ve C# gibi programlama dilleri tarafından başarıyla kullanılmaktadır.

Yazılım geliştirme sadece kod yazmaktan ibaret değildir.

Yazılım belirli bir düzene ve geliştirilebilirliğe sahip olmalıdır.

OOP tekniği içerisinde bulunan soyutlama, arayüz ve kalıtım gibi özelliklerle bu kolay bir şekilde sağlanır.

PHP OOP desteği sayesinde UML, MVC, HMVC, MVVM, Tasarım desenleri gibi OOP ile geliştirme tekniklerini uygulamayı sağlar.

Büyük ölçekli yazılımlar ekip halinde yapılır.

Yazılım içerisinde belirli bir düzen olmadığından kodlar diğer ekip üyeleri tarafından anlaşılmayacaktır.

Daha kötüsü kodu yazan kişi ekipten ayrıldığında kodu anlamak için ek süreye ihtiyaç duyulacaktır.

OOP ile geliştirme yapıldığında kodun anlaşılabilirliği artacağından bu gibi sorunlar ortadan kalkacaktır.

OOP öğrenmenin diğer avantajı PHP ile geliştirilen Zend, Yii, CodeIgniter, Laravel vb. yapıların OOP ile geliştirilmiş olmasıdır.

OOP tekniği öğrenildiğinde bu yapıların öğrenilmesi kolaylaşacaktır.

OOP class

OOP ile yazılım geliştirmede kullanılan nesnelere ait özellik ve işlevlerin tanımlandığı yapıya class denir.

Örnek olarak; kediler ve köpekler bir nesnedir.

Bu nesnelerin belirli bir özelliği (rengi, göz rengi vb.) ve işlevi (miyavlama, havlama, koşma, yakalama vb.) vardır.

Bu özellik ve işlevler class yapısı içerisinde tanımlanarak nesnelerin oluşturulması sağlanır.

class yapısı

PHP class yapısı temel olarak özellik ve işlevlerden meydana gelir.

Özellik öznitelik veya alan olarak, işlev ise metot veya yöntem olarak isimlendirilir.

class örnekleri

PHP class konusunun daha iyi anlaşılabilmesi için aşağıdaki basit class örneklerini incelemek faydalı olacaktır.

Örnekte insan nesnesine ait bir sınıf tanımlanmıştır.

<?php

class Kisi {

  public $adi;
  private $soyadi;

  public function __construct($gelenAdi, $gelenSoyadi) {
    $this->adi = $gelenAdi;
    $this->soyadi = $gelenSoyadi;
  }

  function adiSoyadi() {
    return $this->adi . " " . $this->soyadi;
  }

}

?>

Örnekte kitap nesnesine ait bir sınıf tanımlanmıştır.

<?php

class Kitap {

  public $kitapAdi;
  private $kitapSayfaSayisi;

  public function __construct($gelenKitapAdi, $gelenKitapSayfaSayisi) {
    $this->kitapAdi = $gelenKitapAdi;
    $this->kitapSayfaSayisi = $gelenKitapSayfaSayisi;
  }

  function sayfaSayisi() {
    return $this->kitapSayfaSayisi;
  }

}

?>

NOT: Örnekler class yapısı hakkında bilgi edinmek için basit bir şekilde verilmiştir.

class kullanımı

Tanımlanmış class yapısını kullanmak için bir örneğinin çıkarılması gerekir.

Örnekleme new anahtar kelimesi ile yapılır.

Örnekleme sonrasında bir nesne ortaya çıkar.

<?php

$ben = new Kisi("Yusuf", "SEZER");

?>

Örnekleme sonrasında sınıf içerisindeki özellik ve işlevlere -> ile erişilir.

İşlevleri/metotları çağırma

<?php

$ben = new Kisi("Yusuf", "SEZER");

echo $ben->adiSoyadi();

?>

Özelliklere/niteliklere erişme

<?php

$ben = new Kisi("Yusuf", "SEZER");

echo $ben->adi;

?>

PHP class yapısının daha iyi anlaşılması için çeşitli örnekler yapıp denemek faydalı olacaktır.

OOP özellikler

Nesnelerin tanımlandığı sınıf içindeki değişkenlere özellik denir.

Nesneler çeşitli özelliklere sahip olabilir.

OOP ile yazılım geliştirmede öğrenci nesnesine ait bir sınıf tanımlandığında öğrenciye ait sıra numarası, adı, soyadı ve bölüm gibi bilgiler bir öğrencinin özelliği olarak ifade edilir.

Benzer şekilde kedi nesnesine ait bir sınıf tanımlandığında kedinin rengi, boyu, göz rengi vb. bilgiler nesnenin özellikleri olarak tanımlanır.

Örnekte Ogrenci sınıfı ve özellikleri yer almaktadır.

<?php

class Ogrenci {

  private $ogrenciID = 0;
  public $ogrenciAdi = "";
  public $ogrenciSoyadi = "";
  protected $ogrenciBolum = "";

}

?>

Örnekte Kedi sınıfı ve özellikleri yer almaktadır.

<?php

class Kedi {

  public $kediRengi = "";
  private $kediBoyu = 0.0;
  protected $kediGozRengi = "";

}

?>

Sınıf içerisindeki özelliklere metotlardan $this->ozellikAdi ile erişilir.

Özellikler bir OOP kuralı olan public, protected ve private değerleri alan erişim belirleyicilere sahiptir.

Herhangi bir erişim belirleyici belirtilmediğinde özellik varsayılan olarak public erişim belirleyicisine sahip olur.

OOP metotlar

Nesnelerin tanımlandığı sınıf içindeki fonksiyonlara metot denir.

Nesneler çeşitli metotlara sahip olabilir.

OOP ile yazılım geliştirmede öğrenci nesnesine ait bir sınıf tanımlandığında öğrencinin ders eklemesi, çalışması, öğrenci bilgilerinin fonksiyon yardımıyla döndürülmesi metot olarak ifade edilir.

Benzer şekilde kedi nesnesine ait bir sınıf tanımlandığında kedinin miyavlaması, oyun oynaması, nesnenin metotları olarak tanımlanır.

Örnekte Ogrenci sınıfına özellikler ve metotlar yer almaktadır.

<?php

class Ogrenci {

  private $ogrenciID = 0;
  public $ogrenciAdi = "";
  public $ogrenciSoyadi = "";
  protected $ogrenciBolum = "";
  private $dersler = array();
  public $durum = "";

  public function __construct($oAdi, $oSoyadi, $oBolum) {
	  $this->ogrenciAdi = $oAdi;
	  $this->ogrenciSoyadi = $oSoyadi;
	  $this->ogrenciBolum = $oBolum;
  }

  protected function dersEkle($dersAdi) {
	  $this->dersler[] = $dersAdi;
	  $this->dersCalis($dersAdi);
  }

  private function dersCalis($dersAdi) {
	  $this->durum = $dersAdi . " çalışıyor";
  }

  public function ogrenciBilgileri() {
	  return $this->ogrenciAdi . " - " . $this->ogrenciSoyadi . " - " . $this->ogrenciBolum;
  }

}

$ben = new Ogrenci("Yusuf", "SEZER", "Bilgisayar Mühendisliği");

echo $ben->ogrenciBilgileri();

?>

Örnekte Kedi sınıfı ve özellikleri yer almaktadır.

<?php

class Kedi {

  public $kediRengi = "";
  private $kediBoyu = 0.0;
  protected $kediGozRengi = "";
  
  public function miyavla() {
	  return "Miyav!!!";
  }
  
  public function oyunOyna($oyunAdi) {
	  return "Kedi " . $oyunAdi . " oynuyor";
  }

}

$pamuk = new Kedi;
echo $pamuk->miyavla();
echo "<br />";
echo $pamuk->oyunOyna("Top oyunu");

?>

Sınıf içerisindeki metotlara $this->metotAdi ile erişilir.

Metotlar bir OOP kuralı olan public, protected ve private değerleri alan erişim belirleyicilere sahiptir.

Herhangi bir erişim belirleyici belirtilmediğinde metot varsayılan olarak public erişim belirleyicisine sahip olur.

Metotların değer döndürmesi, parametre alması gibi özellikler php fonksiyonlarıyla aynıdır.

OOP this

PHP ile bir nesne oluşturulduğunda işletim sistemi nesneye ait bilgileri belleğin bir bölümüne yazar.

Bu bilgilere dışardan nesnenin tanımlandığı değişken ile erişilir.

Kedi sınıfındaki metotlara

$tekir = new Kedi();

tanımı yapıldığında $tekir nesnenin bellek adresini/referansını tutar ve nesneye bu referans ile erişilir.

Nesnelerin tanımlandığı sınıf içinde, nesne oluşturulmadığından bellek adresi bilinmez, PHP nesne oluşturulurken bellek adresini $this anahtar kelimesine atar.

Böylece nesne içindeki özellik ve metotlara $this anahtar kelimesi ile ulaşılır.

OOP this kullanımı

Örnekte Kisi nesnesine ait bir sınıf tanımlanmıştır.

<?php

class Kisi {

  public $adi;
  private $soyadi;

  public function __construct($gelenAdi, $gelenSoyadi) {
    $this->adi = $gelenAdi;
    $this->soyadi = $gelenSoyadi;
  }

  function adiSoyadi() {
    return $this->adi . " " . $this->soyadi;
  }

}

?>

Örnekte Urun nesnesine ait bir sınıf tanımlanmıştır.

<?php

<?php 

class Urun {

  public $urunAdi = "";
  public $urunFiyat = 0.0;
  public $urunKDV = 0.0;

  public function __construct($uAdi, $uFiyat, $kdvOrani) {
    $this->urunAdi = $uAdi;
    $this->urunFiyat = $uFiyat;  // Özelliklere erişim 
    $this->urunKDV = $this->kdvHesapla($kdvOrani); // Metotlara erişim
  }

  protected function kdvHesapla($kdvOrani) {
    return $this->urunFiyat * ($kdvOrani / 100);
  }

}

$meyve = new Urun("Elma", 15.0, 18.0);
echo "Ürün Adı : ".$meyve->urunAdi . "<br />";
echo "Ürün Fiyatı : " . $meyve->urunFiyat . "<br />";
echo "Ürün KDV : " . $meyve->urunKDV . "<br />";

?>

OOP this kullanımının daha iyi anlaşılması için çeşitli örnekler yapıp denemek faydalı olacaktır.

OOP erişim belirleyiciler

Nesne yapısının tanımlandığı sınıf yapısı içindeki özellik ve metotlara nereden erişileceğini belirleyen yapıya erişim belirleyici/gizlilik/görünürlük denir.

Nesne içindeki bazı özellik ve metotların dışardan erişilemez olması istenebilir.

Bu durumda özellik veya metodun başına erişim durumuna göre public, protected ve private anahtar kelimeleri yazılır.

Özellik veya metot public ise her yerden erişim sağlanır.

Örnekte üye nesnesine ait bir sınıf tanımlanmıştır.

<?php

class Uye {

  public $uyeAdi = "";
  public $uyeSoyadi = "";

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeAdi = $uAdi;
    $this->uyeSoyadi = $uSoyadi;
  }

  public function adiSoyadi() {
    return $this->uyeAdi . " " . $this->uyeSoyadi;
  }

}

$ben = new Uye("Sefa", "SE");
$ben->uyeAdi = "Yusuf";
$ben->uyeSoyadi = "SEZER";
echo $ben->adiSoyadi();

?>

Özelliklerin erişim durumu public olduğundan dışardan erişim sağlanmıştır.

Özellik veya metot protected ise sınıf içinden ve kalıtım ile türetilen sınıf içinden erişim sağlanır.

<?php

class Uye {

  protected $uyeAdi = "";
  protected $uyeSoyadi = "";

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeAdi = $uAdi;  // protected üyeye erişim
    $this->uyeSoyadi = $uSoyadi;  // protected üyeye erişim
  }

  protected function adiSoyadi() {
    return $this->uyeAdi . " " . $this->uyeSoyadi;
  }

}

$ben = new Uye("Sefa", "SE");
//$ben->uyeAdi = "Yusuf";     // hata verecektir.
//$ben->uyeSoyadi = "SEZER";  // hata verecetir.
//echo $ben->adiSoyadi();     // hata verecektir.

?>

Özelliklerin erişim durumu protected olduğundan dışardan erişim sağlanamamıştır.

Özellik veya metot private ise sadece sınıf içinden erişim sağlanır.

<?php

class Uye {

  private $uyeAdi = "";
  private $uyeSoyadi = "";

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeAdi = $uAdi;  // private üyeye erişim
    $this->uyeSoyadi = $uSoyadi;  // private üyeye erişim
  }

  private function adiSoyadi() {
    return $this->uyeAdi . " " . $this->uyeSoyadi;
  }

}

$ben = new Uye("Sefa", "SE");
//$ben->uyeAdi = "Yusuf";     // hata verecektir.
//$ben->uyeSoyadi = "SEZER";  // hata verecetir.
//echo $ben->adiSoyadi();     // hata verecektir.

?>

Özelliklerin erişim durumu private olduğundan dışardan erişim sağlanamamıştır.

Erişim durumu protected ve private olan özelliklere erişim dolaylı olarak public olan metotlar tarafından yapılabilir.

<?php

class Uye {

  protected $uyeAdi = "";
  private $uyeSoyadi = "";

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeAdi = $uAdi;
    $this->uyeSoyadi = $uSoyadi;
  }

  public function setAdi($uAdi) {
    $this->uyeAdi = $uAdi;  // protected özelliğe dolaylı erişim
  }

  public function setSoyadi($uSoyadi) {
    $this->uyeSoyadi = $uSoyadi;  // private özelliğe dolaylı erişim
  }

  function adiSoyadi() {  // metoda herhangi bir erişim durumu verilmedi?
    return $this->uyeAdi . " " . $this->uyeSoyadi;
  }

}

$ben = new Uye("Sefa", "SE");
$ben->setAdi("Yusuf");
$ben->setSoyadi("SEZER");
echo $ben->adiSoyadi();

?>

Özellik veya metoda ait herhangi bir erişim durumu belirtilmediğinde varsayılan olarak public değerini alır.

OOP kurucular ve yıkıcılar

Nesne belleğe yüklendiğinde yapılacak işlemler için PHP tarafından otomatik olarak çağrılan kurucu metottan (__construct) faydalanır.

Nesne bellekten silinirken yapılacak işlemler için PHP tarafından otomatik olarak çağrılan yıkıcı metottan (__destruct) faydalanır.

<?php

class OrnekNesne {

  public function __construct() {  // Nesne oluşturulduğunda otomatik çalışacak metot
    echo "Nesne belleğe yüklendi. <br />";
  }

  public function __destruct() {  // Nesne silindiğinde otomatik çalışacak metot
    echo "Nesne bellekten silindi.";
  }

}

$nesne = new OrnekNesne();

?>

Örnekte Uye nesnesine ait bir sınıf tanımlanmıştır.

<?php

class Uye {

  private $uyeAdi = "";
  private $uyeSoyadi = "";

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeAdi = $uAdi;
    $this->uyeSoyadi = $uSoyadi;
  }

}

$ben = new Uye("Yusuf", "SEZER");

?>

Dosya işlemlerinin yapıldığı bir sınıf içerisinde kurucu metot ile dosyanın açılması, yıkıcı metot ile de dosyanın kapatılması sağlanabilir.

Örnekte dosya işlemleri nesnesine ait bir sınıf tanımlanmıştır.

<?php

class DosyaIslemleri {

  private $dosya = null;
  private $dosyaAdi = "";
  private $dosyaBoyutu = 0;

  public function __construct($dAdi) {
    $this->dosyaAdi = $dAdi;
    $this->dosya = fopen($this->dosyaAdi, "r+");
    $this->dosyaBoyutu = filesize($this->dosyaAdi);
  }
  
  public function dosyaOku() {
    return fread($this->dosya, $this->dosyaBoyutu);
  }
  
  public function __destruct() {
    fclose($this->dosya);
  }

}

$metin = new DosyaIslemleri("dosya.txt");

echo $metin->dosyaOku();

?>

Kurucu ve yıkıcı metotların kullanımı zorunlu değildir.

OOP Sabitler

Değerinin sonradan değişmesi istenmeyen değişkenlere sabit denir.

Örnek olarak PI sayısı, E sayısı, KDV oranı vb. verilebilir.

PHP ile nesne içinde sabit tanımlamak için const anahtar kelimesi kullanılır.

<?php

class OrnekNesne {

  const PI = 3.14;

}

?>

Sabitin değeri bir işlem sonucu olabilir.

<?php

class OrnekNesne {

  const PI = 2 + 2;

}

?>

Sabitlere sınıf içerisinden self anahtar kelimesi ile erişilir.

<?php

class OrnekNesne {

  const ADI_SOYADI = "Yusuf SEZER";

  public function yazdir() {
    return self::ADI_SOYADI;  // Sabite erişim
  }

}

$ben = new OrnekNesne();

echo $ben->yazdir();

?>

Sabitlere nesne oluşturmadan kapsama operatörü (::) ile erişilebilir.

<?php

class OrnekNesne {

  const ADI_SOYADI = "Yusuf SEZER";

}

echo OrnekNesne::ADI_SOYADI;

?>

Sabitlere türetilen sınıf içerisinden parent anahtar kelimesi ile erişilir.

<?php

class OrnekNesne {

  const ADI_SOYADI = "Yusuf SEZER";

}

class YeniNesne extends OrnekNesne {

  public function yazdir() {
    return parent::ADI_SOYADI;  // Sabite erişim
  }

}

$ben = new YeniNesne();

echo $ben->yazdir();

?>

Sabit değişkenler diğer değişkenlerden farklı olarak $ ile başlamaz.

Sabit değişken oluşturulduktan sonra değer atanması zorunludur.

Sabit değişkenlerin adı PHP içinde kullanılan if, while gibi anahtar kelime olamaz.

Sabit değişkenler erişim belirleyicilere (public, protected, private) sahip olabilir.

Sabit değişkenlerin adlandırılmasında genellikle büyük karakter kullanılır.

OOP static

PHP static anahtar kelimesi sadece bir örneğinin olması gereken özellik ve metotlar için kullanılır.

Örnek olarak PDO sınıfına ait getAvailableDrivers metodu verilebilir.

<?php

print_r(PDO::getAvailableDrivers());

?>

const anahtar kelimesinden farkı static özelliklerin değerinin değişmesi ve $ ile başlamasıdır.

Sınıf içinde static özellik tanımlamak için static anahtar kelimesi kullanılır.

<?php

class Uye {

  static $uyeSayisi = 0;

  public static function uyeSayisi() {

  }

}

?>

Sınıf içindeki static özellik ve metotlara self anahtar kelimesi ile erişilir.

<?php

class Uye {

  static $uyeSayisi = 0;

  public static function uyeSayisi() {
    return self::$uyeSayisi;  // static özellik
  }

  public function getBilgi() {
    return self::uyeSayisi();  // static metot
  }

}

?>

Sınıf içindeki static özellik ve metotlara nesne oluşturmadan kapsama operatörü (::) ile erişilebilir.

<?php

error_reporting(E_ALL);

class Uye {

  static $uyeSayisi = 0;

  public static function uyeSayisi() {
    return self::$uyeSayisi;
  }

  public function getBilgi() {
    return self::uyeSayisi();
  }

}

echo Uye::$uyeSayisi;    // static özellik
echo Uye::uyeSayisi();   // static metot
//echo Uye::getBilgi();  // hata verir.

?>

Sınıf içindeki static özellik ve metotlara türetilen sınıf içerisinden parent anahtar kelimesi ile erişilir.

<?php

class Uye {

  static $uyeSayisi = 0;

  public static function uyeSayisi() {
    return self::$uyeSayisi;
  }

}

class Yonetici extends Uye{

  public function uyeSayisiErisim() {
    parent::$uyeSayisi++;
    return parent::uyeSayisi();
  }

}

$admin = new Yonetici();

echo $admin->uyeSayisiErisim();

?>

Sınıf içindeki static metottan, static olmayan özellik ve metotlara $this veya self anahtar kelimesi ile erişilemez.

<?php

error_reporting(E_ALL);

class Uye {

  static $uyeSayisi = 0;

  public static function uyeSayisi() {
    return $this->getBilgi();
  }

  public function getBilgi() {
    return self::$uyeSayisi;
  }

}

echo Uye::$uyeSayisi;     // static özellik
//echo Uye::uyeSayisi();  // hata verir

?>

Örnekte Uye sınıfı ve static özellik ve metot kullanımı ile ilgili örnek yer almaktadır.

<?php

class Uye {

  private $uyeID = 0;
  private $uyeAdi = "";
  private $uyeSoyadi = "";
  private static $uyeSayisi = 0;

  public function __construct($uAdi, $uSoyadi) {
    $this->uyeID = self::$uyeSayisi + 1;
    $this->uyeAdi = $uAdi;
    $this->uyeSoyadi = $uSoyadi;
    self::$uyeSayisi++;
  }

  public static function uyeSayisi() {
    return self::$uyeSayisi;
  }

  public function uyeBilgi() {
    return $this->uyeID. " - " . $this->uyeAdi . " - " . $this->uyeSoyadi . "<br/>";
  }

}

$ben = new Uye("Yusuf", "SEZER");
echo $ben->uyeBilgi();
$mehmet = new Uye("Mehmet", "SEZER");
echo $mehmet->uyeBilgi();
$sinan = new Uye("Sinan", "SEZER");
echo $sinan->uyeBilgi();

echo "Toplam Üye sayısı : " . Uye::uyeSayisi();

?>

Sınıf içindeki static metot ve özellikler erişim belirleyicilere (public, protected, private) sahip olabilir.

OOP kalıtım

Detaylı bilgi için PHP OOP Kalıtım yazısına bakabilirsiniz.

OOP final

OOP yöntemi içerisindeki en önemli özellik olan katılım yöntemi bazen istenmeyen bir durum olabilir.

Bu durumda nesne tanımının yapıldığı sınıfın başına final anahtar kelimesi eklenerek sınıfın kalıtım alınması engellenir.

<?php

final class OrnekNesne {

  public function adiYazdir() {
    return "Yusuf";
  }

}

class YeniNesne extends OrnekNesne {  // hata verir.

  public function adiYazdir() {
    return "Yusuf";
  }

}

?>

Benzer şekilde final anahtar kelimesiyle bir metodun tekrar tanımlanması engellenir.

<?php

class OrnekNesne {

  final public function adiYazdir() {
    return "Yusuf";
  }

}

class YeniNesne extends OrnekNesne {

  public function adiYazdir() {  // hata verir.
    return "Yusuf";
  }

}

?>

PHP içindeki final özelliği sayesinde nesne ve metot güvenliği sağlanmış olur.

OOP abstract class

Detaylı bilgi için PHP OOP abstract yazısına bakabilirsiniz.

OOP interface

Detaylı bilgi için PHP OOP interface yazısına bakabilirsiniz.

OOP trait

Detaylı bilgi için PHP OOP trait yazısına bakabilirsiniz.

OOP sihirli metotlar

Detaylı bilgi için PHP OOP Sihirli Metotlar yazısına bakabilirsiniz.

OOP anonim sınıflar

Herhangi bir isme sahip olmayan sınıflara anonim sınıf denir. Anonim sınıflar OOP class yapısına benzer.

Ancak anonim sınıflara bir isim verilmediğinden sadece bir defa kullanılır.

Anonim sınıf oluşturmak içi new class yazmak yeterli olacaktır.

<?php

echo (new class {

  private $ogrenciAdi = "Yusuf";
  private $ogrenciSoyadi = "SEZER";

  public function adiSoyadi() {
    return $this->ogrenciAdi . " " . $this->ogrenciSoyadi;
  }
})->adiSoyadi();

?>

Anonim sınıflar genellike değer döndürme işleminde kullanılır.

<?php

function Hesaplama($s1, $s2) {
  return new class($s1, $s1) {

    private $sayi1 = 0.0;
    private $sayi2 = 0.0;

    function __construct($s1, $s2) {
      $this->sayi1 = $s1;
      $this->sayi2 = $s2;
    }

    public function Topla() {
      return $this->sayi1 + $this->sayi2;
    }

    public function Cikar() {
      return $this->sayi1 - $this->sayi2;
    }

    public function Carp() {
      return $this->sayi1 * $this->sayi2;
    }

    public function Bol() {
      return $this->sayi1 / $this->sayi2;
    }
  };
}

echo Hesaplama(10, 20)->Topla();
echo "<br />";
echo Hesaplama(10, 20)->Carp();

?>

OOP clone

Nesneler temel veri tipleri gibi eşittir (=) ifadesiyle kopyalanamaz.

Nesneleri kopyalamak için clone anahtar kelimesi kullanılır.

Temel veri tipleri eşittir ifadesiyle eşitlendikten sonra değeri değişse bile eşitlenen değer değişmez.

<?php

$adi = "Yusuf";
$ben = $adi;
$ben = "Yusuf SEZER";
echo $adi . "<br />";
echo $ben . "<br />";

?>

Ancak nesneler eşittir (=) ifadesiyle eşitlenirse nesneye ait özelliğin değeri değişirse eşitlenen nesnenin değeri de değişir.

<?php

class Ogrenci {

  public $ogrenciAdi = "";
  public $ogrenciSoyadi = "";

  function __construct($oAdi, $oSoyadi) {
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
  }

  public function ogrenciBilgileri() {
    return $this->ogrenciAdi . " " . $this->ogrenciSoyadi;
  }

}

$ben = new Ogrenci("Yusuf", "SEZER");
$sinan = $ben;
$sinan->ogrenciAdi = "Sinan";
$sinan->ogrenciSoyadi = "SEZER";

echo $sinan->ogrenciBilgileri(); // Sinan SEZER
echo "<br />";
echo $ben->ogrenciBilgileri();   // ??

?>

Nesneler eşittir (=) ifadesi ile kopyalanamadığından clone anahtar kelimesi ile kopyalanır.

<?php

class Ogrenci {

  public $ogrenciAdi = "";
  public $ogrenciSoyadi = "";

  function __construct($oAdi, $oSoyadi) {
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
  }

  public function ogrenciBilgileri() {
    return $this->ogrenciAdi . " " . $this->ogrenciSoyadi;
  }

}

$ben = new Ogrenci("Yusuf", "SEZER");
$sinan = clone $ben;  // clone ile kopyaladık.
$sinan->ogrenciAdi = "Sinan";
$sinan->ogrenciSoyadi = "SEZER";

echo $sinan->ogrenciBilgileri(); // Sinan SEZER
echo "<br />";
echo $ben->ogrenciBilgileri();   // ??

?>

Nesnelerin değeri değişse bile diğer nesne bundan etkilenmeyecektir.

OOP tür dayatma

PHP içindeki metotlar veya fonksiyonlar çeşitli parametre değeri alarak işlem yapar.

Toplama işlemi için parametre olarak alınan iki sayı yerine harf veya cümle yazıldığında PHP uyarı verecek ve istenmeyen bir sonuç üretecektir.

<?php

function Topla($sayi1, $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("Yusuf", "SEZER");  // ??

?>

PHP 7 ile birlikte desteği genişleyen Tür Dayatma özelliği ile daha fazla parametre türü belirtilebilir.

<?php

function Topla(int $sayi1, int $sayi2) {
  return $sayi1 + $sayi2;
}

echo Topla("Yusuf", "SEZER");  // ??

?>

Girilen parametre türü belirtilenden farklıysa PHP Fatal error verip çalışmayı durduracaktır.

Parametre türü temel veri tipi (int, string, float) olabileceği gibi bir nesne de olabilir.

<?php

class Ogrenci {

  public $ogrenciAdi = "";
  public $ogrenciSoyadi = "";

  function __construct($oAdi, $oSoyadi) {
    $this->ogrenciAdi = $oAdi;
    $this->ogrenciSoyadi = $oSoyadi;
  }

}

function ogrenciBilgileri(Ogrenci $ogr) {

  return $ogr->ogrenciAdi . " " . $ogr->ogrenciSoyadi;
}

$ben = new Ogrenci("Yusuf", "SEZER");

echo ogrenciBilgileri($ben);

?>

Tür dayatma özelliği nesne içindeki metotlarda da kullanılabilir.

OOP zincirleme metotlar

Nesne içindeki metotların $this anahtar kelimesi ile nesneyi tekrar referans göstererek nesne içindeki elemanları tekrar kullanmak için geliştirilen bir yöntemdir.

Yöntem metotların birbirine zincir halkası gibi bağlanmasından dolayı Zincirleme Metot (chaining metod) ismini almıştır.

<?php

class HesapMakinesi {

  private $sonuc = 0;

  function __construct($sayi) {
    $this->sonuc = $sayi;
  }

  public function Toplama($sayi) {
    $this->sonuc += $sayi;
    return $this;
  }

  public function Cikarma($sayi) {
    $this->sonuc -= $sayi;
    return $this;
  }

  public function Carpma($sayi) {
    $this->sonuc *= $sayi;
    return $this;
  }

  public function Bolme($sayi) {
    $this->sonuc /= $sayi;
    return $this;
  }

  public function Goster() {
    echo $this->sonuc;
    return $this->sonuc;
  }

}

$hesap = new HesapMakinesi(50);
$hesap->Toplama(20)->Cikarma(10)->Goster();
//$hesap->Toplama(20)->Bolme(10)->Goster();

?>

Örnekteki tüm metotların geri dönüş değeri olarak $this kullandığına dikkat edin.

OOP namespace

Detaylı bilgi için PHP OOP namespace yazısına bakabilirsiniz.

OOP aşırı yükleme

Detaylı bilgi için PHP OOP Aşırı Yükleme yazısına bakabilirsiniz.

OOP autoload

Detaylı bilgi için PHP OOP autoload yazısına bakabilirsiniz.

PHP OOP Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.


Bunlara'da bakmalısın!