2012-06-28 22 views
58

Başta, her iki yöntemin neden kurucuda çalıştığı konusunda kafam karışmıştı, ama şimdi anladığımı düşünüyorum. Uzanan sınıflar, ebeveynin yöntemlerini sınıfın kendisinde beyan edilmiş gibi miras alır ve ebeveynlerde yöntemler vardır, dolayısıyla her ikisi de çalışmalıdır.php'de üst yöntemi çağırmanın birden fazla yolu

Şimdi, yöntemi çağırmanın (parent veya this aracılığıyla) tercih edilen bir yolu (örn. En iyi uygulama) olup olmadığını ve bunların aynı kodu yürütmenin gerçekten aynı yöntemleri olup olmadığını merak ediyorum. diğerini kullanırken herhangi bir uyarı.

Üzgünüz, muhtemelen bunu düşünüyorum. Ben soruyu yanlış anlama bulunmadığım sürece (bu durumda köpeğinde) alt sınıf bu yöntemi üzerine çünkü bunu uzatmak gelmez çünkü

abstract class Animal { 

    function get_species() { 

     echo "test"; 

    } 

} 

class Dog extends Animal { 

    function __construct(){ 

     $this->get_species(); 
     parent::get_species(); 

    } 

} 

$spike = new Dog; 

cevap

77

üst sınıfında yöntem çıkışları nerede bir alt sınıfta yöntemi çağırır üç senaryo (Aklıma o) vardır:

  1. Yöntem alt sınıf tarafından yazılmaz, sadece var ebeveyn.

    Bu, örneğinizle aynıdır ve genellikle $this -> get_species();'u kullanmak daha iyidir. Bu durumda, iki yöntemin aynı olduğu doğrudur, ancak yöntem alt sınıf tarafından devralınmıştır, dolayısıyla ayırt etmek için bir neden yoktur . $this kullanarak, devralınan yöntemler ve yerel olarak bildirilen yöntemler arasında tutarlı kalırsınız. Alt sınıf tarafından yöntemin üzerine yazılır ve üst öğeden tamamen benzersiz bir mantığı vardır. Bu durumda

    , açıktır ki idam yönteminin ebeveynin versiyonunu istemiyoruz çünkü $this -> get_species(); kullanmak istersiniz. Yine, $this'u sürekli kullanarak, bu dava ile ilk arasındaki ayrım konusunda endişelenmenize gerek yoktur.

  2. Yöntem, ana yöntemin ulaştığı öğeye ekleyerek üst sınıfı genişletir. Bu durumda

    , hala alt sınıfının diğer yöntemlerden yöntemini ararken `$this -> get_species(); kullanmak istiyorum. Ebeveyn yöntemini arayacağınız tek yer, üst yöntemin üzerine yazan yöntemden olacaktır. Örnek: olurdunuz ağır basan yöntemin dışında doğrudan ana yöntemi çağırmak gerekir nerede iki farklı şey yaptıysam

    abstract class Animal { 
    
        function get_species() { 
    
         echo "I am an animal."; 
    
        } 
    
    } 
    
    class Dog extends Animal { 
    
        function __construct(){ 
    
         $this->get_species(); 
        } 
    
        function get_species(){ 
    
         parent::get_species(); 
         echo "More specifically, I am a dog."; 
        } 
    } 
    

sadece senaryo hayal edebiliyorum ve size ebeveynin versiyonunu gerektiği anlaşıldı yöntem, yerel değil.Bu durum olmamalıdır, ama kendini belli yapsam, bu yaklaşım temiz yolu öyle tüm çağrı ebeveyn yöntemi olduğu get_parentSpecies() gibi bir adla yeni bir yöntem oluşturmak olacaktır:

function get_parentSpecies(){ 

    parent::get_species(); 
} 

Yine, bu her şeyi güzel ve tutarlı tutar, ana yönteme güvenmek yerine yerel yöntemde değişiklikler/değişiklikler yapılmasına izin verir.

+0

"Uzat" olmadan nasıl yaparım? "İnsan" sınıfında klapa "bacak" a benzediğim gibi, ancak ebeveynin "insan" işlevselliğine ihtiyacım olmadığı için onu genişletmem gerekmiyor. Şimdi, eğer 'insan' içinde bir '$ leg = yeni bacak()' yaratmış olsaydım, insanın işlevlerini bacağın '$ bacağı' içinden nasıl arardım? – user151496

+0

@ user151496 Bacak, insanın bir alt sınıfı değildir. Bir insanın pek çok bacağı vardır, ama bir bacak bir tür insan değildir. Bu nedenle, insandan miras kalan bir bacak sınıfına sahip olmamalısınız, çünkü bir bacak insan değildir. – Beetle

+0

Leg'i Leggy arayüzüne sahip bir sınıf yapar mısınız? Ya da sadece İnsan sınıfı Leggy'yi uygular mı? Bir bacağın insanlara özel olmadığını değil, aynı zamanda insan bacaklarının benzersiz bir biçimde insan olduğunu ve insanların genel bir özelliğini de tanımladığını en iyi nasıl tanımlayabiliriz? – Anthony

5

, ben hemen hemen her zaman> get_species $ this- kullanmak. Eğer sınıf köpeği yöntemi yeniden tanımlamazsa, her iki yol da işlevsel olarak eşdeğerdir, fakat eğer gelecekte bir noktada köpekte get_species yönteminin "köpek" yazmasını istediğinize karar verirseniz, o zaman tüm kodu ve değiştir.

$ Bunu kullandığınızda, aslında sizin oluşturduğunuz nesnenin bir parçasıdır ve bu nedenle her zaman en güncel olanı olur (eğer kullanılan özellik nesnenin kullanım ömründe bir şekilde değişmişse). Üst sınıfı kullanarak statik sınıf yöntemini çağırıyor.

+0

Bu yöntemi geçersiz kılmak istendiğinde $ kullanmak için iyi bir nokta. Teşekkürler – jerry

İlgili konular