- Özellikleri ve metotları olan bir sınıf yazmak ve
newile nesne oluşturmak - Yapıcıda özellik tanımlamayı,
readonly'yi ve görünürlük düzeylerini uygulamak - Statik üyeleri ve
extendsile 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
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";Aysel: 75.5 AZN
| Görünürlük | Nereden erişilebilir |
|---|---|
public | her yerden |
protected | sınıfın kendisinden ve ondan türeyen sınıflardan |
private | yalnı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.
class Product
{
private string $name;
private float $price;
public function __construct(string $name, float $price)
{
$this->name = $name;
$this->price = $price;
}
}class Product
{
public function __construct(
private string $name,
private float $price,
) {}
}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
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";20.49 AZN 2049
addeski nesneyi değiştirmez, yeni birMoneynesnesi döndürür; değişmez nesneler böyle çalışır.- Özel
__toStringmetodu nesneyi bir dizeye çevirir;echo $totalbu 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
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";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
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";
}Fish makes a sound Mestan says Meow Bobik makes a sound: Woof!
Önemli noktalar
- Sınıf bir plandır, nesne ise
newile oluşturulan örneğidir;$thiso anki nesneyi,->ise bir üyeye erişimi ifade eder. public,protectedveprivateüyelerin nereden görüneceğini belirler; veriyiprivatetut 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 daSınıfAdı::ile okunur. extendskalıtım oluşturur,parent::üst sınıfın metodunu çağırır,finalise kalıtımı yasaklar.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
$this neyi gösterir?