Web geliştirme serüveninizde PHP’nin temellerini, değişkenleri, döngüleri ve fonksiyonları öğrendikten sonra karşınıza çıkacak en büyük ve en önemli dönüm noktası Nesne Yönelimli Programlama (Object-Oriented Programming – kısaca OOP) olacaktır.
PHP projeleriniz büyüdükçe ve karmaşıklaştıkça, yüzlerce farklı fonksiyonu ve değişkeni bir arada yönetmek zorlaşır. İşte bu noktada, kodunuzu tekrar kullanılabilir, düzenli ve gerçek dünyayı modelleyen mantıksal bloklara ayırmanızı sağlayan OOP devreye girer. PHP 5.0 sürümü ile birlikte dile tam anlamıyla entegre edilen, PHP 7 ve modern PHP 8.x sürümleriyle inanılmaz güçlü bir hale gelen bu yapıyı, en temelden başlayarak gerçek hayat örnekleriyle adım adım inceleyeceğiz.
Nesne Yönelimli Programlama (OOP) Nedir? (Gerçek Hayat Analojisi)
Nesne yönelimli programlamanın temelinde iki ana kavram yatar: Sınıflar (Classes) ve Nesneler (Objects).
Bir sınıfı (class), üretilecek olan ürünün kâğıt üzerindeki bir şablonu, planı veya mimari çizimi olarak düşünebilirsiniz. Nesne (object) ise, o şablondan üretilmiş somut, fiziksel ürünün ta kendisidir.
Otomobil Fabrikası Örneği: Bir “Otomobil” şablonu (sınıf) düşünün. Bu şablonda arabanın rengi, markası gibi bilgiler ve arabanın hızlanması, fren yapması gibi yetenekler tanımlanmıştır. Ancak bu şablonun kendisini süretemezsiniz. Bu şablondan somut bir “Kırmızı Ford” veya “Mavi Honda” ürettiğinizde (nesne), artık bu arabaları kullanabilirsiniz.
OOP terminolojisinde, bir sınıfın içindeki değişkenlere Özellik (Property), fonksiyonlara ise Metot (Method) adı verilir. Bir sınıfı kendi içinde çalışan minyatür bir ekosistem olarak düşünebilirsiniz.
PHP’de Sınıf (Class) ve Nesne (Object) Oluşturma
PHP’de bir sınıf oluşturmak fonksiyon oluşturmaya çok benzer. class anahtar kelimesi kullanılır ve ardından sınıfın adı yazılarak süslü parantezler { } açılır.
Aşağıdaki örneği inceleyelim:
<?php
// Sınıf (Class) Tanımlaması
class Otomobil {
// Özellikler (Properties - Değişkenler)
public $renk;
public $marka;
public $hiz = 0;
// Metotlar (Methods - Fonksiyonlar)
public function hizlan() {
// $this anahtar kelimesi "bu sınıf/nesne" anlamına gelir
$this->hiz += 10;
echo 'Hızlanıyor... Şu anki hız: ' . $this->hiz . '<br>';
}
public function frenYap() {
$this->hiz -= 10;
echo 'Yavaşlıyor... Şu anki hız: ' . $this->hiz . '<br>';
}
}
?>
Yukarıdaki kodda sadece bir şablon yarattık. Şimdi bu şablondan gerçek bir nesne (araba) üretelim ve onu kullanalım. Bir sınıftan nesne üretmek için new anahtar kelimesi kullanılır.
<?php
// 'Otomobil' sınıfından yeni bir nesne (Object) üretiyoruz
$arabam = new Otomobil();
// Nesnenin özelliklerine (properties) değer atıyoruz
$arabam->renk = 'Kırmızı';
$arabam->marka = 'Ford';
// Nesnenin metotlarını (methods) çalıştırıyoruz
$arabam->hizlan(); // Çıktı: Hızlanıyor... Şu anki hız: 10
$arabam->hizlan(); // Çıktı: Hızlanıyor... Şu anki hız: 20
$arabam->frenYap(); // Çıktı: Yavaşlıyor... Şu anki hız: 10
?>
Önemli Bir Kural: Sınıf içindeki metotlardan, yine aynı sınıf içindeki özelliklere ulaşmak istiyorsanız, $this sihirli değişkenini kullanmak zorundasınız. $this, kabaca “üzerinde çalıştığım bu nesne” anlamına gelir. Nesnenin metotlarına ve özelliklerine dışarıdan ulaşırken ise tire ve büyüktür işaretinden oluşan -> operatörü kullanılır.
Kurucu ve Yıkıcı Metotlar (Constructors & Destructors)
Bazen bir nesne yaratıldığı ilk anda bazı işlemlerin otomatik olarak yapılmasını isteriz (örneğin veritabanına bağlanmak veya başlangıç değerlerini atamak gibi). PHP, bunun için Kurucu (Constructor) adı verilen özel bir metot sunar. Aynı şekilde nesnenin işi bitip hafızadan silinmeden hemen önce çalışan Yıkıcı (Destructor) metotlar da vardır.
Kurucu metotlar __construct(), yıkıcı metotlar ise __destruct() adıyla tanımlanır. (Başında iki adet alt çizgi bulunur).
<?php
class Makine {
// Kurucu Metot: Nesne 'new' ile yaratıldığı an çalışır
public function __construct() {
echo "Makine başlatılıyor...<br>";
}
// Yıkıcı Metot: Nesne hafızadan silinirken çalışır
public function __destruct() {
echo "Makine kapatılıyor...<br>";
}
}
// Nesneyi oluşturalım
$benimMakinem = new Makine();
// Çıktı: Makine başlatılıyor...
// Nesneyi hafızadan silelim
unset($benimMakinem);
// Çıktı: Makine kapatılıyor...
?>
Kalıtım (Inheritance) ile Kod Tekrarını Önleme
OOP’nin en güçlü yönlerinden biri Kalıtım (Extensibility/Inheritance) özelliğidir. Kalıtım sayesinde, önceden yazılmış genel bir sınıfın (Ebeveyn) tüm özelliklerini ve metotlarını, yeni oluşturacağınız bir sınıfa (Çocuk) miras olarak aktarabilirsiniz. PHP’de bu işlem extends anahtar kelimesi ile yapılır.
Örneğin, genel bir “Memeli (Mammal)” sınıfımız olsun. Bu sınıftan türeteceğimiz “İnsan (Human)” sınıfı, memelilerin tüm genel özelliklerini otomatik olarak devralırken, kendisine has yeni özellikler de barındırabilir.
<?php
// Ebeveyn (Parent) Sınıf
class Memeli {
public $yas;
public function buyu() {
$this->yas += 1;
echo "Büyüyor... Yeni yaş: " . $this->yas . "<br>";
}
}
// Çocuk (Child) Sınıf
class Insan extends Memeli {
public $isim;
public function isimSoyle() {
echo "Benim ismim " . $this->isim . "<br>";
}
}
// İnsan sınıfından nesne üretelim
$kisi = new Insan();
$kisi->isim = "Ahmet";
$kisi->yas = 25; // Memeli sınıfından miras alındı!
$kisi->isimSoyle(); // Kendi metodu
$kisi->buyu(); // Memeli sınıfından miras alınan metot (Çıktı: Büyüyor... Yeni yaş: 26)
?>
Gördüğünüz gibi Insan sınıfının içine buyu() adında bir metot yazmadığımız halde, Memeli sınıfını extends ile miras aldığı için bu metodu sorunsuzca kullanabildik.
Görünürlük ve Erişim Belirleyiciler (Visibility)
Uygulamanız büyüdükçe, her değişkenin (özelliğin) dışarıdan rastgele değiştirilmesini istemezsiniz. Bu durum güvenlik açıklarına ve kod hatalarına sebep olabilir. PHP’de özellikleri ve metotları korumak için üç farklı görünürlük (visibility) seviyesi vardır:
public(Genel): Sınıfın içinden, dışından veya miras alan diğer sınıflardan her yerden tamamen erişilebilir.protected(Korumalı): Sadece o sınıfın kendi içinden ve o sınıfı miras alan (extends) çocuk sınıflar içerisinden erişilebilir. Dış dünyadan doğrudan müdahale edilemez.private(Gizli): En katı koruma seviyesidir. Sadece ve sadece tanımlandığı o ana sınıfın içerisinden erişilebilir.
<?php
class BankaHesabi {
public $hesapSahibi = "Onur"; // Herkes görebilir
private $bakiye = 5000; // Dışarıdan doğrudan erişilemez
// Bakiye bilgisini sadece bizim belirlediğimiz güvenli bir metot üzerinden okuyabiliriz
public function bakiyeGoster() {
return $this->bakiye . " TL";
}
}
$hesap = new BankaHesabi();
echo $hesap->hesapSahibi; // Çalışır (Çıktı: Onur)
// echo $hesap->bakiye; // HATA VERİR! (private özelliğe dışarıdan erişilemez)
echo $hesap->bakiyeGoster(); // Çalışır (Çıktı: 5000 TL)
?>
Modern PHP’de OOP (2026 ve Ötesi)
Özellikle PHP 8 sürümleriyle birlikte nesne yönelimli programlama dünyasına harika özellikler katılmıştır. Modern PHP kodlarında bolca görebileceğiniz bazı yenilikler şunlardır:
- Constructor Property Promotion (PHP 8.0): Sınıf özelliklerini tanımlama ve kurucu metotta değer atama işlemi tek bir satıra indirilerek kod kalabalığı önlenmiştir.
- Readonly Sınıflar (PHP 8.2): Sadece okunabilir özellikler ve sınıflar tanımlayarak verilerin yanlışlıkla değiştirilmesini imkansız hale getiren mükemmel bir güvenlik önlemidir.
- Property Hooks (PHP 8.4): Sınıf içindeki değişkenlerin (özelliklerin) başına veya sonuna özel işlem kancaları (get/set hooks) ekleyerek, bir özelliğe değer atandığı an arka planda başka kodların çalışmasını tetikleyen, kodlarınızı %50’ye kadar küçülten devrimsel bir özelliktir.
Sonuç
Nesne Yönelimli Programlama (OOP), başlangıçta prosedürel (düz yukarıdan aşağıya akan) programlamaya alışmış zihinler için kafa karıştırıcı görünebilir. Ancak Sınıf (Class) ve Nesne (Object) arasındaki şablon/ürün ilişkisini anladığınızda, __construct() metotlarıyla başlangıç zeminini hazırlamayı ve extends ile özellikleri başka nesnelere miras bırakmayı öğrendiğinizde, daha az kod yazarak çok daha profesyonel işler çıkardığınızı fark edeceksiniz. Günümüzde Laravel ve Symfony gibi dünyanın en popüler ve modern PHP çatılarının (framework) tamamı OOP temelleri üzerinde yükselmektedir; bu nedenle bu kavramlara hakim olmak profesyonel web geliştirme yolculuğunda sizin en büyük anahtarınız olacaktır.





