- Konu sahibi
- #1
PHP OOP, yani Nesne Yönelimli Programlama, kodu sınıflar ve bu sınıflardan üretilen nesneler etrafında düzenleme yaklaşımıdır. Bir sınıf; verileri özelliklerde, bu verilerle çalışan davranışları ise metotlarda toplar. Böylece aynı sorumluluğa ait kodlar bir arada tutulur, erişim sınırları belirlenir ve büyüyen uygulamalarda bakım kolaylaşır.
Örneğin bir kullanıcıyı yalnızca dizi olarak tutmak yerine, kullanıcı adını doğrulayan ve ekrana uygun biçimde gösteren bir sınıf oluşturabilirsiniz. Sınıf kalıp, nesne ise bu kalıptan üretilmiş çalışan örnektir.
Sınıf, özellikleri ve metotları tanımlar. Nesne,
Özellik nesnenin verisini, metot ise nesnenin yapabildiği işi temsil eder.
Kapsülleme, nesnenin iç durumunu koruyup dışarıya yalnızca gerekli işlemleri açmaktır. Kalıtım, ortak davranışların başka bir sınıftan alınmasını sağlar; ancak yalnızca sınıflar arasında gerçek bir “bir türdür” ilişkisi varsa kullanılmalıdır. Arayüz ise bir sınıfın hangi metotları sunacağını belirleyen sözleşmedir. Farklı sınıflar aynı arayüzü uygulayarak farklı çalışma biçimlerini ortak bir kullanım noktasında birleştirebilir.
Tablodaki ayrım kesin bir zorunluluk değildir. Küçük bir betiği yalnızca OOP kullanacak şekilde karmaşıklaştırmak yerine, kodun sorumlulukları arttıkça sınıflara geçmek daha anlaşılır olabilir.
Aşağıdaki örnek PHP dosyası olarak doğrudan çalıştırılabilir.
Bu örnekte
Komut bulunamadı veya dosya çalıştırılamadı hatası alırsanız PHP'nin komut satırı çalıştırıcısının kurulu ve PATH üzerinden erişilebilir olduğunu kontrol edin. Geçersiz bir ad verirseniz
En sık hata, her şeyi sınıfa taşımayı OOP sanmaktır. Yalnızca getter ve setter eklemek de tek başına iyi tasarım anlamına gelmez. Sınıflar gerçek bir sorumluluğu, geçerli durum kurallarını ve birlikte çalışan davranışları temsil etmelidir. Ayrıca
Örneğin bir kullanıcıyı yalnızca dizi olarak tutmak yerine, kullanıcı adını doğrulayan ve ekrana uygun biçimde gösteren bir sınıf oluşturabilirsiniz. Sınıf kalıp, nesne ise bu kalıptan üretilmiş çalışan örnektir.
OOP'nin temel parçaları
Sınıf ve nesne
Sınıf, özellikleri ve metotları tanımlar. Nesne,
new anahtar sözcüğüyle sınıftan oluşturulur. Aynı sınıftan farklı değerlere sahip birçok nesne üretilebilir.Özellik ve metot
Özellik nesnenin verisini, metot ise nesnenin yapabildiği işi temsil eder.
private, protected ve public erişim belirleyicileri bu üyelerin nereden kullanılabileceğini sınırlar. Genellikle dışarıdan doğrudan değiştirilmemesi gereken veriler private tutulur ve kontrollü metotlarla yönetilir.Kapsülleme, kalıtım ve arayüz
Kapsülleme, nesnenin iç durumunu koruyup dışarıya yalnızca gerekli işlemleri açmaktır. Kalıtım, ortak davranışların başka bir sınıftan alınmasını sağlar; ancak yalnızca sınıflar arasında gerçek bir “bir türdür” ilişkisi varsa kullanılmalıdır. Arayüz ise bir sınıfın hangi metotları sunacağını belirleyen sözleşmedir. Farklı sınıflar aynı arayüzü uygulayarak farklı çalışma biçimlerini ortak bir kullanım noktasında birleştirebilir.
| Yaklaşım | Veri ve davranış | Uygun ihtiyaç |
|---|---|---|
| Prosedürel | Değişkenler ve fonksiyonlarla akış | Küçük ve doğrusal işlemler |
| OOP | Veri ve kurallı işlemler nesnede | Durumu ve yaşam döngüsü olan varlıklar |
| Arayüz tabanlı tasarım | Ortak sözleşme, farklı uygulamalar | Değiştirilebilir servisler |
Tablodaki ayrım kesin bir zorunluluk değildir. Küçük bir betiği yalnızca OOP kullanacak şekilde karmaşıklaştırmak yerine, kodun sorumlulukları arttıkça sınıflara geçmek daha anlaşılır olabilir.
Çalışan en küçük OOP örneği
Aşağıdaki örnek PHP dosyası olarak doğrudan çalıştırılabilir.
private kullanıcı adının sınıf dışından rastgele değiştirilmesini engeller; getDisplayName() ise kontrollü bir çıktı sağlar.- Aşağıdaki kodu
user.phpadıyla kaydedin. - Komut satırında dosyanın bulunduğu klasöre geçip
php user.phpkomutunu çalıştırın. - Başarılı sonuç olarak
Kullanıcı: Adaçıktısını kontrol edin.
Kod:
<?php
class User
{
private string $name;
public function __construct(string $name)
{
$name = trim($name);
if ($name === '') {
throw new InvalidArgumentException('Kullanıcı adı boş olamaz.');
}
$this->name = $name;
}
public function getDisplayName(): string
{
return 'Kullanıcı: ' . $this->name;
}
}
$user = new User('Ada');
echo $user->getDisplayName() . PHP_EOL;
Bu örnekte
__construct() nesne oluşturulurken otomatik çalışır ve geçersiz boş değeri reddeder. $this, o anda kullanılan nesneyi ifade eder. new User('Ada') bir User nesnesi üretir; ardından metot çağrılır.Komut bulunamadı veya dosya çalıştırılamadı hatası alırsanız PHP'nin komut satırı çalıştırıcısının kurulu ve PATH üzerinden erişilebilir olduğunu kontrol edin. Geçersiz bir ad verirseniz
InvalidArgumentException oluşması beklenen davranıştır; çağıran kodun bu istisnayı try/catch ile ele alması gerekir. Gerçek bir uygulamada kullanıcı verisini doğrulamak, görüntülemekten ayrı bir sorumluluk olabilir; örnek yalnızca OOP'nin temel yapısını göstermek içindir.PHP'de OOP kullanırken kararlar
- Önce sınıfın tek ve anlaşılır sorumluluğunu belirleyin. Örneğin
Userkullanıcı durumunu,Mailerise e-posta gönderimini temsil etsin. - Dışarıdan değiştirilmemesi gereken özellikleri
privateyapın ve geçerli durumu koruyan metotlar sağlayın. - Aynı işlemi farklı sınıflar yapacaksa önce ortak bir arayüz gerekip gerekmediğini değerlendirin; yalnızca kod tekrarını azaltmak için kalıtım eklemeyin.
- Sınıflar başka dosyalara ayrıldığında
namespaceveusedüzenini kullanın; dosyaları otomatik yüklemek için projenin seçtiği autoload mekanizmasını yapılandırın. - Bir sınıfın çok fazla sorumluluğu oluşuyorsa onu daha küçük sınıflara ayırın ve her sınıfı bağımsız test edilebilir hale getirin.
En sık hata, her şeyi sınıfa taşımayı OOP sanmaktır. Yalnızca getter ve setter eklemek de tek başına iyi tasarım anlamına gelmez. Sınıflar gerçek bir sorumluluğu, geçerli durum kurallarını ve birlikte çalışan davranışları temsil etmelidir. Ayrıca
public özellikleri sınırsız kullanmak kapsüllemeyi zayıflatır; nesnenin geçersiz bir duruma sokulmasını önlemek için değişiklikleri kontrollü metotlardan geçirmek daha güvenlidir.