2010-06-20 16 views
28

Çocuğun __construct() işlevini çocuğunuzun __construct() işlevinden önce PHP'de miras olarak çağırmak mümkün olup olmadığını merak ediyordum.PHP'de çocuk yapıcısından önce ana yapıcıyı çağırın

Örnek:

class Tag { 
    __construct() { 
     // Called first. 
    } 
} 

class Form extends Tag { 
    __construct() { 
     // Called second. 
    } 
} 

new Form(); 

İdeal olarak, ben aralarında bir şeyler yapmak mümkün olacaktır. Eğer bu mümkün değilse, bunu yapmamı sağlayacak bir alternatif var mı?

Bunu yapmak istememin nedeni, __construct() çağrıldığında Form'un kullanabileceği Etikete özgü bir dizi varsayılan ayar yükleyebilmektir.

DÜZENLEME: Maalesef bunu eklemeyi unuttum .. Çocuk sınıfından ana sınıfı çağırmamayı tercih ederim.

$tag = new Tag($privateInfo, $publicInfo); 
$tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance. 

Tag.php

: o çocuğa (ebeveyn için) bazı özel verileri ortaya çıkarır çünkü bağımsız değişken olarak geçmek zaman

Bu yapmak istediğim şey, basitçe var

class Tag { 
    private $privateInfo; 
    public $publicInfo; 
    __construct($private, $public) { 
     $this->privateInfo = $private; 
     $this->publicInfo = $public; 
    } 
} 

giriş başlıkları

class Form extends Tag { 

    __construct() { 
     echo $this->publicInfo; 
    } 
} 

Mantıklı?

Teşekkürler! senin yapı içinde Matt Mueller

+0

Bu anlama geldiğinde ne yapacağınızı ayrıntılı olarak açıklayabilir misiniz? '' Ebeveyn için bazı özel verileri (ebeveyn için) '* gösteriyor? –

+2

Bir ana sınıfın özel verileri herhangi bir alt sınıfa maruz bırakılmayacaktır. Kamu veya korumalı veriler olacak, özel değil. –

+0

Yah, ancak (özel) parametreler ilk çocuk kurucusundan geçerse, çocuğun bunlara erişimi vardır. Açıklığa kavuşturmak için düzenledim. – Matt

cevap

46

Sadece ebeveyn çağrı :: __ çocukta yaparız.

class Form extends Tag 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     // Called second. 
    } 
} 
+1

Ahh özür dilerim. Çocuk yapıcısında buna sahip olmamayı tercih ettiğimi eklemeyi unuttum. Lütfen düzenlemeyi okuyun. – Matt

+0

Bunun alternatiflerin en iyisi olduğuna karar verdi. Ne yazık ki, tam olarak istediğim değil - oh iyi .. Teşekkürler! – Matt

+0

Oh vay Denis, son birkaç gündür bana gerçekten yardım ettin .. Teşekkürler adamım! – Matt

3

evet sadece aramak parent::__construct()

+0

Ahh Üzgünüz, bir şartı eklemeyi unuttum ... Lütfen güncelleme için düzenlemeyi okuyun. – Matt

+2

Bunu yapmanın yolu, kabul etmiyorsanız OOP el kitabını okuyun. Tekerleği yeniden icat etmeye çalışmayın. Modelinizle ilgili endişeleriniz varsa, bunu nasıl yaptığınızı görmek için de yayınlamayı deneyin. Muhtemelen kötü bir tasarım tekniği yapıyorsunuzdur. – Pentium10

+0

Tekerleği yeniden icat etmeye çalışmıyorum ... Gereksinimlerime bir çözüm bulmaya çalışıyorum. – Matt

3

Evet, ama sadece içten (yani bir PHP uzantısı yazarak), ben senin yerinde olsam parent::__construct() arayarak ile razıyım böylece. PHP wiki'de this section'a bakın.

Üzgünüz, PHP Java değil. Süper kurucunun aranması (örtülü veya açık bir şekilde) gerektirmemek çok zayıf bir tasarım kararıydı.

1

Yaptığınız seslerden, tasarımınızı yeniden düşünmek isteyebilirsiniz, böylece yapıcıdaki parametreleri iletmenize gerek kalmaz. Yapılabileceğini düşünmüyorsanız, bunu bir soru olarak sorun, bazı önerilerden şaşırmış olabilirsiniz.

Alt sınıf, üst yapıcıyı hiç çağırmadan geçersiz kılma özelliğine sahiptir. Ebeveyn sınıfında son bir yönteme sahip olmanızı öneririm. Böylelikle herkes bilir ki, bu durumun aşılmasını istemiyorsunuz ve miras kalan herhangi bir sınıf (haklı olarak) yapıcıda istediği her şeyi yapma hakkına sahiptir.

class Father { 
    private $_privateData; 
    final function setPrivateData($privateData) { 
     $this->_privateData = $privateData; 
    } 
} 

Başka

önerilmez, "Tekerleği yeniden icat" daha, çözüm üst sınıfında bir işlev tanımlamak olacaktır _construct(), yani kendi yapı denilen söylüyorlar. Onun gerçekten açık değil, dil özellikleri/yapıları kullanmaz ve tek bir uygulamaya çok özgüdür.

Akılda tutulması gereken son bir şey var: Bilgiyi çocuk sınıfından gerçekten saklayamazsınız.Yansıma, serileştirme, var_dump, var_export ve php dilinde diğer tüm bu kullanışlı API'lar ile, eğer veri ile hiçbir şey yapmamanız gereken bir kod varsa, o zaman saklamaktan başka bir şey yapamazsınız. Kum havuzlarının oluşturulmasına yardımcı olacak kütüphaneler vardır, ancak bir nesneyi kendi kendine sınırlamak zordur.

Düzenleme: Her nasılsa Artefacto'un cevabını özledim ve sanırım haklı (bunu yapmak için bir uzantı yazmayı denemedim). Yine de, bunu uygulamak, geliştiricilerin beklentilerini kırıyor ve içeride neler olduğunu açıklamak için aslında kodu görmeyi zorlaştırıyor.

+0

Hey, cevabınız için teşekkürler. Ne yazık ki bu konu biraz elden çıktı, bu benim hatam. Her neyse, yeniden tasarlamaya çalışıyorum. Cevabınız hakkında bir sorum var ... bunu nasıl yapabilirsiniz? - "Çocuk dersi ana kurucuyu hiç çağırmadan geçersiz kılma yeteneğine sahip." – Matt

+0

@Matt Sadece PHP kodunu kullanamazsınız. Türetilmiş sınıfı yazan kişi, üst yapıcıyı hiç çağırmama yeteneğine sahiptir. Bir proje için yapabilecekleriniz, üst sınıfın yapısını tanımlayan ve çağırdığı _construct() adlı yapıtında ana sınıf tarafından çağrılan tanımlanmış başka bir işleve sahip. – Reece45

İlgili konular