Nesnelerin Kalıtımı

Kalıtım iyi kurgulanmış bir programlama prensibidir ve PHP bu prensibi kendi nesne modelinde kullanır. Bu prensip çoğu sınıf ve nesnenin bir diğeri ile ilişkisini düzenler.

Örneğin, bir sınıf (extend ile) genişletildiğinde alt sınıf üst sınıftaki genel ve korunmuş yöntemlerin tümünü miras alır. Bir sınıf bu yöntemleri aynı isimdeki yöntemlerle geçersizleştirmedikçe bunlar özgün işlevselliklerini korur.

Bu, işlevselliği tanımlamak ve soyutlamak için ve paylaşılan işlevselliğin tamamını yeni baştan gerçeklemeksizin benzer nesnelerde ek işlevsellikleri gerçeklemek için kullanışlıdır.

Bir ebeveyn sınıfın private yöntemlerine bir çocuk sınıftan erişilemez. Sonuç olarak, normal miras alma kurallarına aldırmadan çocuk sınıfların bu private yöntemleri yeniden gerçeklemesi gerekebilir. PHP 8.0.0 öncesinde, private yöntemlere bunun yanında final ve static sınırlamaları da uygulanırdı. PHP 8.0.0 ve sonrasında zorunlu olan tek private yöntem kısıtlaması, private final kuruculardır, çünkü bu, yerleşik statik yöntemleri kullanırken kurucuyu "devre dışı" bırakmanın yaygın bir yoludur.

Yöntemlerin, özelliklerin ve sabitlerin görünürlüğü gevşetilebilir, örn. protected bir yöntem public olarak imlenebilir; ancak sınırlandırılamaz, örneğin bir public özellik, private olarak imlenebilir. Görünürlüğü kısıtlanabilen kurucular istisnadır, örn. bir public kurucu, bir çocuk sınıfta private olarak imlenebilir.

Bilginize:

Otomatik yükleme kullanılmadıkça, sınıflar kullanılmadan önce tanımlanmalıdır. Eğer bir sınıf diğerini genişletiyorsa ebeveyn sınıf çocuk sınıfın yapısı kurulmadan önce bildirilmiş olmalıdır. Bu kural diğer sınıfları ve arayüzleri miras alan tüm sınıflara uygulanır.

Bilginize:

Okunup yazılabilir bir özellik salt-okunur özellik vb. ile geçersiz kılınamaz.

<?php

class A {
public
int $prop;
}
class
B extends A {
// Geçersiz: oku-yaz özellik salt-okunur yapılamaz
public readonly int $prop;
}
?>

Örnek 1 Kalıtım Örneği

<?php

class Foo
{
public function
printItem($string)
{
echo
'Foo: ' . $string . PHP_EOL;
}

public function
printPHP()
{
echo
'PHP is great.' . PHP_EOL;
}
}

class
Bar extends Foo
{
public function
printItem($string)
{
echo
'Bar: ' . $string . PHP_EOL;
}
}

$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Çıktısı: 'Foo: baz'
$foo->printPHP(); // Çıktısı: 'PHP is great'
$bar->printItem('baz'); // Çıktısı: 'Bar: baz'
$bar->printPHP(); // Çıktısı: 'PHP is great'

?>

Dahili Sınıflar ve Dönüş Türü Uyumluluğu

PHP 8.1 öncesinde, dahili sınıfların vaya yöntemlerin çoğunda dönüş türü bildirimi yoktu ve bunları genişletirken dönüş türüne izin veriliyordu.

PHP 8.1.0 ve sonrasında, çoğu dahili yöntem dönüş türlerini "geçici olarak" bildirmeye başladı, bu durumda yöntemin dönüş türü, genişletilen ebeveyn ile uyumlu olmalıdır; aksi takdirde, bir kullanımdan kaldırma bildirimi çıktılanır. Açık bir dönüş türü bildiriminin olmayışı, ayrıca yapısal bir uyuşmazlık olarak kabul edilmekte ve dolayısıyla kullanımdan kaldırma bildirimiyle sonuçlanmaktadır.

PHP'nin sürümler arası uyumluluk endişeleri nedeniyle geçersiz kılma yöntemi için dönüş türü bildirilemezse, kullanımdan kaldırma bildirimini sessizleştirmek için ReturnTypeWillChange özniteliği eklenebilir.

Örnek 2 - Dönüş türünü bildirmeyen geçersiz kılma yöntemi

<?php
class MyDateTime extends DateTime
{
public function
modify(string $modifier) { return false; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier) should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" as of PHP 8.1.0
// Kullanımı önerilmiyor: MyDateTime::modify(string $modifier) için dönüş türü ya DateTime::modify(string $modifier): DateTime|false ile uymlu olmalı ya da PHP 8.1.0 ve sonrasında uyarıyı susturmak için #[\ReturnTypeWillChange] özniteliği kullanılmış olmalıdır.
?>

Örnek 3 - Yanlış dönüş türü bildiren geçersiz kılma yöntemi

<?php
class MyDateTime extends DateTime
{
public function
modify(string $modifier): ?DateTime { return null; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier): ?DateTime should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" as of PHP 8.1.0
// Kullanımı önerilmiyor: MyDateTime::modify(string $modifier): ?DateTime için dönüş türü ya DateTime::modify(string $modifier): DateTime|false ile uymlu olmalı ya da PHP 8.1.0 ve sonrasında uyarıyı susturmak için #[\ReturnTypeWillChange] özniteliği kullanılmış olmalıdır.
?>

Örnek 4 - Yanlış dönüş türü bildiren ama kullanımı önerilmiyor uyarısı vermeyen geçersiz kılma yöntemi

<?php
class MyDateTime extends DateTime
{

#[\ReturnTypeWillChange]
public function
modify(string $modifier) { return false; }
}

// Bir uyarı tetiklenmez
?>
To Top