Constructor Promotion (8.0)
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 42 / 91.
PHP 8.0, sınıfları tanımlarken basmakalıp kod miktarını önemli ölçüde azaltan bir özellik olan constructor promotion özelliğini tanıttı. Özellikleri ayrı ayrı bildirmek ve ardından bunları yapıcı metot (constructor) içinde atamak yerine, her ikisini de tek bir adımda yapabilirsiniz.
İşte şimdiye kadar kullandığınız geleneksel yaklaşım:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
Constructor promotion ile erişim belirleyicisini doğrudan constructor parametrelerine eklersiniz:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
Çıktı:
Laptop: $999.99Bir yapıcı (constructor) parametresinden önce private, protected veya public ekleyerek, PHP otomatik olarak özelliği oluşturur ve değeri atar. Aynı yapıcı içinde terfi ettirilmiş (promoted) ve normal parametreleri karıştırabilir ve gerekirse yapıcı gövdesinin içine hala mantık ekleyebilirsiniz.
Önemli Nokta: Constructor promotion, tam kapsülleme kontrolünü korurken sınıflarınızı daha temiz ve okunması daha kolay hale getirerek tekrarlayan özellik tanımlamalarını ve atamalarını ortadan kaldırır.
Görev
KolayYapıcı tanıtımı (constructor promotion) özelliğinin zarafetini sergileyen bir kişi yönetim sistemi oluşturalım. Uygun kapsüllemeyi korurken gereksiz kodları (boilerplate) ortadan kaldıran temiz, modern bir PHP sınıfı oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Contact.php— Tüm özellikleri doğrudan yapıcı imzasında tanımlamak için yapıcı tanıtımını kullanan birContactsınıfı oluşturun. Kişiniz şunlara sahip olmalıdır:- Özel (private) bir
$nameözelliği (string) - Özel (private) bir
$emailözelliği (string) - Varsayılan değeri
"Not provided"olan özel (private) bir$phoneözelliği (string)
"[name] | [email] | [phone]"döndüren bir publicgetFullDetails()metodu ekleyin. Ayrıca"Contact: [name]"döndüren birgetSummary()metodu ekleyin.- Özel (private) bir
main.php— Contact dosyasını dahil edin. Üç girdi alacaksınız: bir isim, bir e-posta ve bir telefon numarası. İkiContactörneği oluşturun:- İlk kişi her üç değeri de (isim, e-posta ve telefon) kullanmalıdır
- İkinci kişi yalnızca ismi ve e-postayı kullanmalıdır (varsayılan telefon değerine güvenerek)
- İlk kişinin tam detayları (full details)
- İlk kişinin özeti (summary)
- İkinci kişinin tam detayları (full details)
- İkinci kişinin özeti (summary)
Yapıcı tanıtımının (constructor promotion); özellikleri tanımlamanıza, görünürlüklerini ayarlamanıza, türlerini belirtmenize ve değer atamanıza — hepsini tek bir okunabilir yapıcı imzasında — nasıl olanak tanıdığına dikkat edin. Varsayılan değere sahip isteğe bağlı telefon parametresi, tanıtılan parametrelerin tıpkı normal parametreler gibi varsayılan değerlerle sorunsuz çalıştığını gösterir.
Kopya kağıdı
PHP 8.0, bir erişim belirleyici ekleyerek sınıf özelliklerini doğrudan yapıcı metot (constructor) parametrelerinde tanımlamanıza ve başlatmanıza olanak tanıyan constructor promotion özelliğini tanıttı.
Geleneksel yaklaşım:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
}
Constructor promotion ile:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
}
$product = new Product("Laptop", 999.99);
Bir yapıcı metot parametresinden önce private, protected veya public ekleyerek, PHP otomatik olarak özelliği oluşturur ve değeri atar.
Özelliğe dönüştürülmüş parametrelerle varsayılan değerler kullanabilirsiniz:
<?php
class Contact {
public function __construct(
private string $name,
private string $email,
private string $phone = "Not provided"
) {}
}
Constructor promotion normal parametrelerle karıştırılabilir ve gerekirse yapıcı metot gövdesi içine hala mantık ekleyebilirsiniz.
Kendin dene
<?php
require_once 'Contact.php';
// Girişi oku
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Üç değerin tümüyle (ad, e-posta, telefon) ilk kişiyi oluşturun
// TODO: Sadece ad ve e-posta ile ikinci kişiyi oluşturun (varsayılan telefonu kullanın)
// TODO: İlk kişinin tüm detaylarını yazdırın
// TODO: İlk kişinin özetini yazdırın
// TODO: İkinci kişinin tüm detaylarını yazdırın
// TODO: İkinci kişinin özetini yazdırın
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi