Menu
Coddy logo textTech

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.99

Bir 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.

challenge icon

Görev

Kolay

Yapı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 bir Contact sı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)
    Yapıcı tanıtımı (constructor promotion) sözdizimini kullanın — ayrı özellik bildirimlerine gerek yoktur! "[name] | [email] | [phone]" döndüren bir public getFullDetails() metodu ekleyin. Ayrıca "Contact: [name]" döndüren bir getSummary() metodu ekleyin.
  • main.php — Contact dosyasını dahil edin. Üç girdi alacaksınız: bir isim, bir e-posta ve bir telefon numarası. İki Contact ö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)
    Dört satır yazdırın:
    • İ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

?>
quiz iconKendini test et

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