İçeriğe geç
Educora
Orta18 dk6 / 10

Sınıflar ve nesneler

Sınıflar oluştur, yapıcıda özellik tanımlamayı (constructor promotion) ve readonly özellikleri kullan; statik üyeleri ve kalıtımı öğren.

Kendini test et
Bu derste öğreneceklerin
  • Özellikleri ve metotları olan bir sınıf yazmak ve new ile nesne oluşturmak
  • Yapıcıda özellik tanımlamayı, readonly'yi ve görünürlük düzeylerini uygulamak
  • Statik üyeleri ve extends ile kalıtımı kullanmak

Bir banka hesabının bir sahibi ve bakiyesi vardır; hesaba para yatırılabilir ve bakiye kontrol edilebilir. Verileri ve onlarla çalışan fonksiyonları bir arada tutmak için nesne yönelimli programlama (OOP) kullanılır. Laravel ve Symfony gibi modern PHP çatıları tamamen sınıflar üzerine kuruludur; bu yüzden bu konu profesyonel PHP çalışmasının temelidir.

Sınıf ve nesne

Sınıf, nesnelerin planıdır: hangi özelliklere (verilere) ve metotlara (eylemlere) sahip olacaklarını tanımlar. Nesne, bir sınıfın new ile oluşturulmuş somut bir örneğidir. Bir metodun içinde $this o anki nesneyi gösterir; özelliklere ve metotlara -> operatörüyle erişilir. __construct metodu nesne oluşturulduğu anda otomatik olarak çağrılır.

PHP
<?php

class Account
{
    public string $owner;
    private float $balance = 0.0;

    public function __construct(string $owner)
    {
        $this->owner = $owner;
    }

    public function deposit(float $amount): void
    {
        $this->balance += $amount;
    }

    public function getBalance(): float
    {
        return $this->balance;
    }
}

$acc = new Account("Aysel");
$acc->deposit(50);
$acc->deposit(25.5);
echo $acc->owner, ": ", $acc->getBalance(), " AZN\n";
Beklenen çıktı
Aysel: 75.5 AZN
GörünürlükNereden erişilebilir
publicher yerden
protectedsınıfın kendisinden ve ondan türeyen sınıflardan
privateyalnızca sınıfın kendisinden
$acc->balance yazarsan Cannot access private property hatası alırsın; bakiye yalnızca metotlar aracılığıyla değişir.

Yapıcıda özellik tanımlama ve readonly

Yukarıdaki sınıfta $owner üç kez yazılmış: özellik, parametre ve atama olarak. PHP 8'in constructor promotion özelliğiyle görünürlüğü doğrudan yapıcının parametresine yazarsın; PHP özelliği kendisi tanımlar ve değeri kendisi atar.

PHP 7 üslubu
class Product
{
    private string $name;
    private float $price;

    public function __construct(string $name, float $price)
    {
        $this->name = $name;
        $this->price = $price;
    }
}
PHP 8: constructor promotion
class Product
{
    public function __construct(
        private string $name,
        private float $price,
    ) {}
}
İki sınıf da aynı işi yapar ama sağdaki yarı yarıya kısadır.

PHP 8.1'den beri bir özellik readonly olarak tanımlanabilir: ona yalnızca bir kez, sınıfın içinde değer verilir. Daha sonra değiştirmeye çalışırsan Cannot modify readonly property Money::$amount hatası alırsın. Böyle değişmez nesneler para, tarih ve koordinat gibi değerler için idealdir. Aşağıda parayı qəpik (manatın kuruşu) cinsinden tam sayı olarak saklıyoruz: 1 manat = 100 qəpik.

PHP
<?php

final class Money
{
    public function __construct(
        public readonly int $amount,
        public readonly string $currency = "AZN",
    ) {}

    public function add(Money $other): Money
    {
        return new Money($this->amount + $other->amount, $this->currency);
    }

    public function __toString(): string
    {
        return number_format($this->amount / 100, 2) . " " . $this->currency;
    }
}

$price = new Money(1250);
$total = $price->add(new Money(799));
echo $total, "\n";
echo $total->amount, "\n";
Beklenen çıktı
20.49 AZN
2049
  • add eski nesneyi değiştirmez, yeni bir Money nesnesi döndürür; değişmez nesneler böyle çalışır.
  • Özel __toString metodu nesneyi bir dizeye çevirir; echo $total bu yüzden çalışır.
  • final, bu sınıftan alt sınıf türetilmesini yasaklar.

Statik üyeler

Statik özellikler ve metotlar tek bir nesneye değil, sınıfın tamamına aittir. Onlara SınıfAdı::üye yazımıyla, sınıfın içinden ise self:: ile erişilir. Sınıf sabitleri (const) de aynı şekilde okunur. Aşağıda sınıf, kaç öğrenci nesnesi oluşturulduğunu sayıyor.

PHP
<?php

class Student
{
    public const MAX_IN_CLASS = 30;
    private static int $count = 0;

    public function __construct(public string $name)
    {
        self::$count++;
    }

    public static function count(): int
    {
        return self::$count;
    }
}

new Student("Leyla");
new Student("Murad");
$s = new Student("Nigar");

echo Student::count(), " of ", Student::MAX_IN_CLASS, "\n";
echo $s->name, "\n";
Beklenen çıktı
3 of 30
Nigar

Kalıtım

extends anahtar sözcüğüyle bir sınıf, başka bir sınıfın tüm public ve protected üyelerini kalıtım yoluyla alır ve istediği metotları yeniden yazabilir (override). Üst sınıfın metoduna parent:: ile erişilir. PHP'de bir sınıfın yalnızca bir üst sınıfı olabilir. Aynı metodun farklı sınıflarda farklı çalışmasına çok biçimlilik (polimorfizm) denir.

PHP
<?php

class Animal
{
    public function __construct(protected string $name) {}

    public function speak(): string
    {
        return "{$this->name} makes a sound";
    }
}

class Cat extends Animal
{
    public function speak(): string
    {
        return "{$this->name} says Meow";
    }
}

class Dog extends Animal
{
    public function speak(): string
    {
        return parent::speak() . ": Woof!";
    }
}

$pets = [new Animal("Fish"), new Cat("Mestan"), new Dog("Bobik")];
foreach ($pets as $pet) {
    echo $pet->speak(), "\n";
}
Beklenen çıktı
Fish makes a sound
Mestan says Meow
Bobik makes a sound: Woof!

Önemli noktalar

  • Sınıf bir plandır, nesne ise new ile oluşturulan örneğidir; $this o anki nesneyi, -> ise bir üyeye erişimi ifade eder.
  • public, protected ve private üyelerin nereden görüneceğini belirler; veriyi private tut ve metotlarla değiştir.
  • Constructor promotion (PHP 8) özellikleri yapıcının parametrelerinde tanımlar; readonly (PHP 8.1) bir özelliği değişmez yapar.
  • Statik üyeler sınıfa aittir ve self:: ya da SınıfAdı:: ile okunur.
  • extends kalıtım oluşturur, parent:: üst sınıfın metodunu çağırır, final ise kalıtımı yasaklar.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Bir metodun içinde $this neyi gösterir?