İçeriğe geç
← Blog

PHP OOP: Kalıtım (Inheritance), Interface ve Sınıflar Arası Veri Erişimi

15 Temmuz 2009, 08:24 PHP 5 dk 8.1k 0

Önceki yazılarımızda nesne yönelimli programlama (Object Oriented Programming – OOP) ile basit bir veritabanı bağlantı sınıfı oluşturmuştuk. Bu yazıda ise o bağlantı sınıfını kullanarak veritabanından veri çekmeyi ve bu verileri sınıflar aracılığıyla uygulamanın diğer bölümlerine nasıl aktarabileceğimizi inceleyeceğiz.

Bu yaklaşım sayesinde veritabanı işlemleri tek bir noktada toplanır, kod tekrarları azalır ve uygulama daha düzenli bir yapıya kavuşur.

Konuya geçmeden önce OOP’nin temel yapı taşlarını kısaca hatırlayalım.

Erişim Belirleyicileri (Access Modifiers)

PHP’de en sık kullanılan erişim belirleyicileri şunlardır:

  • public : Sınıfın dışından erişilebilir.
  • private : Yalnızca tanımlandığı sınıf içerisinden kullanılabilir.

Bu yapı sayesinde hangi özelliklerin dışarıya açılacağı, hangilerinin yalnızca sınıf içerisinde kullanılacağı kontrol altına alınabilir.

Class, Extends ve Implements

Bir sınıf oluşturmak için class anahtar kelimesi kullanılır.

Başka bir sınıfın özelliklerini kullanmak istiyorsak kalıtım (inheritance) yapar ve extends anahtar kelimesini kullanırız.

Bir sınıfın belirli davranışları gerçekleştirmesini zorunlu tutmak için ise interface tanımlar ve implements anahtar kelimesi ile bu interface’i uygularız.

Bir sınıf yalnızca bir sınıftan kalıtım alabilir; ancak birden fazla interface uygulayabilir.

Aşağıdaki örnek bunu göstermektedir.

PHP
<?php

class Person
{
}

class Employee extends Person
{
}

interface LoggerInterface
{
}

interface CacheInterface
{
}

class FileLogger implements LoggerInterface
{
}

class UserService extends Person implements LoggerInterface
{
}

class ProductService extends Person implements LoggerInterface, CacheInterface
{
}

?>

Kalıtım (Inheritance) Neden Kullanılır?

Kalıtımın temel amacı ortak özellikleri tekrar yazmaktan kaçınmaktır.

Gerçek hayattan basit bir örnek düşünelim. Bir çalışan sınıfı oluştururken kişinin adı, soyadı veya doğum tarihi gibi bilgiler her çalışan için ortak olabilir.

Bu durumda bu özellikleri her sınıfta yeniden tanımlamak yerine ortak bir üst sınıfta toplar ve diğer sınıfların bu özellikleri miras almasını sağlayabiliriz.

Bu yaklaşım kod tekrarını azaltır ve bakımını kolaylaştırır.

Interface Nedir?

Interface’ler nesne yönelimli programlamanın en önemli kavramlarından biridir.

Interface içerisinde metotların nasıl çalışacağı değil, hangi metotların bulunması gerektiği tanımlanır.

Böylece farklı sınıflar aynı interface’i uygulayabilir ancak kendi ihtiyaçlarına göre farklı çözümler geliştirebilir.

Bu yaklaşım çok biçimliliğin (Polymorphism) temelini oluşturur.

Veritabanından Veri Okuyan Sınıf

Şimdi daha önce oluşturduğumuz Connection sınıfını kullanarak video bilgilerini veritabanından okuyacak bir sınıf hazırlayalım.

PHP
<?php

class Video extends Connection
{
    /**
     * Returns video information by id.
     *
     * @param int $videoId
     * @return array
     */
    public function getVideoById($videoId)
    {
        $query = "
            SELECT
                id,
                title,
                description,
                created_date
            FROM
                videos
            WHERE
                id = " . (int)$videoId . "
            LIMIT 1
        ";

        $result = parent::query($query);

        $videoInformation = array();

        while ($row = parent::database_fetch_array($result)) {

            $videoInformation = array(
                "id"          => $row["id"],
                "title"       => $row["title"],
                "description" => $row["description"],
                "createdDate" => $row["created_date"]
            );
        }

        return $videoInformation;
    }
}

?>

Bu örnekte ilk dikkat edilmesi gereken nokta, Video sınıfının Connection sınıfından kalıtım almasıdır.

PHP
class Video extends Connection

Böylece bağlantı oluşturma, sorgu çalıştırma ve sonuç okuma gibi işlemleri tekrar yazmamıza gerek kalmaz. Bu işlemler üst sınıfta tanımlandığı için doğrudan kullanabiliriz.

getVideoById() metodu ise verilen video numarasına göre SQL sorgusunu oluşturur, sorguyu çalıştırır ve dönen sonucu bir dizi (array) olarak geri döndürür.

Bu yöntem sayesinde veritabanı işlemleri tek bir sınıfta toplanmış olur.

Public Metoda Nasıl Erişilir?

Bir sınıfın public olarak tanımlanmış metotlarını kullanabilmek için öncelikle o sınıftan bir nesne oluşturmamız gerekir.

PHP
<?php

include "video.class.php";

// Video işlemlerini yönetecek nesneyi oluşturuyoruz.
$videoManager = new Video();

// Veritabanından video bilgilerini alıyoruz.
$videoInformation = $videoManager->getVideoById(1);

// Dönen veriyi görüntülüyoruz.
print_r($videoInformation);

?>

Burada önce Video sınıfından bir nesne oluşturuyoruz.

Ardından getVideoById() metodunu çağırarak veritabanından ID değeri 1 olan videonun bilgilerini alıyoruz.

Metodun döndürdüğü sonuç bir dizi olduğu için ister ekrana yazdırabilir, ister başka sınıflara aktarabilir veya kullanıcı arayüzünde gösterebiliriz.

Neden Böyle Bir Yapı Kullanıyoruz?

Veritabanı sorgularını doğrudan sayfalar içerisinde yazmak yerine bunları ayrı sınıflar içerisinde toplamak birçok avantaj sağlar.

Bunlardan bazıları şunlardır:

  • Kod tekrarını azaltır.
  • Yeniden kullanılabilir (Reusable) yapılar oluşturur.
  • Veritabanı işlemlerini tek bir noktada toplar.
  • Kodun bakımını kolaylaştırır.
  • İş mantığı ile kullanıcı arayüzünü birbirinden ayırır.
  • Büyük projelerde geliştirme sürecini daha yönetilebilir hâle getirir.

Bu yaklaşım günümüzde katmanlı mimari (Layered Architecture) olarak bilinen yapının temelini oluşturan düşüncelerden biridir.

Sonuç

Bu örnekte nesne yönelimli programlama kullanarak veritabanı işlemlerini ayrı bir sınıfta topladık ve bu sınıfın sunduğu metotlar aracılığıyla uygulamanın diğer bölümlerine veri aktardık.

Küçük projelerde bu yapı ilk bakışta gereksiz gibi görünse de proje büyüdükçe kodun okunabilirliği, bakım kolaylığı ve yeniden kullanılabilirliği açısından önemli avantajlar sağlar.

İlerleyen yazılarda kalıtım, interface, polymorphism ve diğer OOP kavramlarını daha ayrıntılı örneklerle incelemeye devam edeceğiz.

📝 Arşiv Notu

Bu yazı ilk olarak 2009 yılında hazırlanmıştır ve örnekler PHP 5 kullanılarak geliştirilmiştir. Yazıda kullanılan kodlar dönemin PHP sürümlerine uygundur. Günümüzde veritabanı işlemleri için PDO veya MySQLi tercih edilse de, bu yazının amacı nesne yönelimli programlamanın temel mantığını anlatmaktır.