Menu

PHP Kalıtım: extends, parent:: ve Metot Ezme

PHP'de bir sınıf class Dog extends Animal ile başka bir sınıftan kalıtım alır: üst sınıfın public ve protected özelliklerini ve metotlarını alır, onları ezebilir (override) ve orijinali yine parent::method() ile çağırabilir. Metot ezmeyi, protected, final, instanceof ve private metot tuzağını öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

PHP'de bir sınıf başka bir sınıftan extends ile kalıtım alır: class Dog extends Animal Dog sınıfına Animal sınıfının her public ve protected özelliğini ve metodunu verir. Alt sınıf yeni metotlar ekleyebilir, aynı adla bir metot tanımlayarak kalıtılanları ezebilir ve orijinali parent::method() ile çağırabilir.

Dog sınıfının yapıcısı yoktur, bu yüzden Animal sınıfınınkini kullanır; new Dog('Rex') ifadesinin çalışmasının nedeni budur. Bir alt sınıf yalnızca bir üst sınıfı genişletebilir; PHP'de sınıflar için çoklu kalıtım yoktur.

Üst sınıfın metodunu parent:: ile çağırma

Ezme, üst sınıfın metodunu tamamen değiştirir. Değiştirmek yerine genişletmek için alt sınıftan parent::method() çağırın ve sonucunun üzerine inşa edin:

Aynısı yapıcılar için parent::__construct(...) ile çalışır; yapıcı sayfası onu unuttuğunuzda ne olduğu dahil bunu anlatır.

Alt sınıflarda protected ile private

Bir protected üye dışarıdaki koddan gizlidir ama ailedeki her sınıf tarafından görülür. Bir private üye yalnızca onu tanımlayan sınıfta görülür, bu yüzden bir alt sınıf onu hiç göremez:

Alt sınıfta isset($this->pin) false olur, çünkü alt sınıfın üst sınıfın private $pin özelliğine erişimi yoktur; üst sınıfın kendi metodu hasPin() ise onu hâlâ okur. Alt sınıfların üzerine inşa etmesi amaçlanan şeyler için protected, değiştirme özgürlüğünü korumak istediğiniz ayrıntılar için private kullanın.

Çok biçimlilik ve instanceof

Üst sınıf türüne göre yazılmış kod her alt sınıfla çalışır. Her nesne ezilmiş bir metodun kendi sürümünü çalıştırır, bu yüzden tek bir döngü hepsini işler. instanceof bir nesnenin bir sınıftan veya onun herhangi bir alt sınıfından olup olmadığını kontrol eder:

Üst sınıfın tek başına asla kullanılmaması gerektiğinde (alanı 0 olan düz bir Shape pek anlamlı değildir), onu bir soyut sınıf yapın ve area() metodunu soyut olarak tanımlayın.

Ezme kuralları: imzalar uyumlu kalmalı

Ezen bir metot en az üst sınıfın kabul ettiğini kabul etmeli ve üst sınıfı çağıranların kullanabileceği bir şey döndürmelidir. İsteğe bağlı bir parametre ekleyebilir, bir parametre türünü genişletebilir veya bir dönüş türünü daraltabilirsiniz; zorunlu bir parametre ekleyemez veya public bir metodu private yapamazsınız.

string $sep = ',' ifadesini zorunlu bir string $sep yapın, PHP sınıfı ölümcül bir hatayla derlemeyi reddeder ("Declaration of CsvExporter::export(array rows,stringrows, string sep): string must be compatible with Exporter::export(array $rows): string").

final sınıflar ve metotlar

final kalıtımı o noktada durdurur. Bir final metot ezilemez ve bir final class genişletilemez. İkisi de dosya derlenirken kontrol edilir, bu yüzden betik hiç başlamaz:

<?php
class Payment
{
    final public function charge(int $cents): string
    {
        return "charged $cents";
    }
}

class FreePayment extends Payment
{
    public function charge(int $cents): string
    {
        return 'free';
    }
}
PHP Fatal error:  Cannot override final method Payment::charge() in /home/index.php on line 12

Final bir sınıf için mesaj Class B cannot extend final class A olur. Üst sınıf bir metodun tam olarak tek bir şekilde davranmasına dayandığında, örneğin başka bir şey yapmadan önce izinleri kontrol eden bir metotta, metodu final olarak işaretleyin.

private metot tuzağı

Private bir metot kalıtılmaz, bu yüzden aynı adlı bir alt sınıf metodu onu ezmez. Üst sınıftaki kod kendi private sürümünü çağırmaya devam eder; bu da alt sınıfın metodunun çalışmasını bekleyenleri şaşırtır:

greet() hâlâ Hello yazdırır: üst sınıfın $this->word() çağrısı üst sınıfın private metoduna çözümlenir. Greeter içinde private ifadesini protected yapın ve tekrar çalıştırın; artık alt sınıfın metodu gerçek bir ezmedir ve greet() Bonjour der.

Sıkça Sorulan Sorular

PHP'de extends nasıl çalışır?

class Dog extends Animal Dog sınıfını Animal sınıfının alt sınıfı yapar. Bir Dog nesnesi Animal sınıfının her public ve protected özelliğine ve metoduna sahiptir, kendi üyelerini ekleyebilir ve aynı adla bir metot tanımlayarak kalıtılan metotları değiştirebilir (ezebilir).

PHP'de üst sınıfın metodunu nasıl çağırırım?

Alt sınıfın metodu içinde parent::methodName() kullanın, örneğin return parent::describe() . ' and more';. Yapıcı için bu parent::__construct(...) olur.

PHP çoklu kalıtımı destekler mi?

Hayır. Bir sınıf yalnızca bir üst sınıfı genişletebilir. Birkaç kaynaktan davranış paylaşmak için birkaç arayüz uygulayın (class A implements B, C) ve trait'ler kullanın (use Loggable, Timestamps;).

PHP'de final ne anlama gelir?

Bir final metot bir alt sınıf tarafından ezilemez ve bir final class hiç genişletilemez. İki kuralı çiğnemek de sınıf derlenirken ölümcül bir hatadır, örneğin Cannot override final method A::f().

PHP'de bir alt sınıf üst sınıfının private özelliğine erişebilir mi?

Hayır. Bir private üye yalnızca onu tanımlayan sınıfa aittir, bu yüzden alt sınıfta $this->pin tanımsız bir özelliktir (bir uyarı, sonra null) ve aynı adlı bir alt sınıf metodu private bir metodu ezmez. Alt sınıfların ihtiyaç duyduğu üyeyi protected olarak tanımlayın.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA