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
{
/**
* @return DateTime|false
*/
#[\ReturnTypeWillChange]
public function modify(string $modifier) { return false; }
}
// Bir uyarı tetiklenmez
?>