Üst sınıf Yöntemleri çağırıyor

2 Cevap php

Question edited to better reflect my needs.


Aşağıdaki örneği ele alalım:

class Base
{
    public $Text = null;

    public function __construct()
    {
        $this->Text = new Base_Text();
    }
}

class Base_Text extends Base
{
    public $Is = null;

    public function __construct()
    {
        $this->Is = new Base_Text_Is();
    }

    public function CammelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }
}

class Base_Text_Is extends Base_Text
{
    public function CammelCase($string)
    {
        return ($string === $this->CammelCase($string)); // doesn't work
    }
}

Nasıl I statik (not using parent:: veya Base_Text sınıfı çağırmadan fix the Base_Text_Is::CammelCase() yöntemi Base_Text::)?

Ben durumlarda bu tür ile geldi tek çözüm bu gibi bir tek işlevi oluşturmak için:

function Base()
{
    static $instance = null;

    if (is_null($instance) === true)
    {
        $instance = new Base();
    }

    return $instance;
}

Ve bu Base_Text_Is::CammelCase() yöntemini değiştirin:

return ($string === Base()->Text->CammelCase($string));

Ve sırayla yerine yapmanın Base sınıfının iki nesne örnekleri, yaratmaktan kaçınmak için:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

Ben sadece bunu:

Base()->Text->Is->CammelCase('MethodOverloading'); // true

Is this a good practice? Are there any other solutions?

2 Cevap

Sorunuzun kalbi burada yatıyor:

How can Son::B() call the Dad::A() method non-statically (without using parent or Dad)?

Cevabı olamaz, basitçe. Sen Dad::A() Son::A() ile overrode. Oğul nesne artık sahip olduğunu A() tek kavramı kendi kullanıcısının A(). Statik veya tamamen farklı Dad nesne örneği üzerinde ana yöntemini çağırmak gerekir.

Alt satırda üst A() yöntem aramak istiyorsanız, neden ilk etapta bunu geçersiz kılmak için rahatsız edilir mi?

Kişisel yapısı ya da herhangi bir anlam ifade etmiyor. Neden $dad->A() sırayla $dad->son->B() çağırır, hangi $dad->son->A() onu geçmek, hangi olur o zaman, size soruyoruz ne, çağrı için bir çağrı isterim $dad->A() Tekrar? Bu sonsuz bir döngü var.

Sizin tekiz yaklaşım emin Birden babam nesne örneğini yok yapma dışında herhangi bir gerçek avantaj sunmak için görünmüyor, ama aslında hala içeride olması gerektiği gibi geliyor mantığını gerçekleştirmek için tamamen ayrı bir nesneyi başlatmasını konum olduğunu sınıf ve dışında.

Gerçek mantık görme ve başarmak için çalışıyoruz ne olmadan, bu dairesel bağımlılığını önlemek için tavsiye bilmek zor. Ancak, Eğer bu yöntemlerle yapmak ve belki de miras nasıl çalıştığını yeniden tasarlamak için çalışıyoruz ne analiz etmek isteyebilirsiniz düşünüyorum.

EDIT

Ben oluyor çok fazla bir miras var düşünüyorum. Bunu yaparken gereken hiçbir sebep yoktur:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

Tüm işlevselliği çocuk sınıflarında ise, Base sınıf başlatmasını edilmemelidir. Bu gibi bir şey olmalıdır:

$text = new Text();
$text->isCamelCase('someString');

Sizin kodu büyük ölçüde tüm kaldırıldı dairesel üst / alt örneklemesi ve çocuk sınıflar aşağı itti özel işlevselliği ile, basitleştirilmiş olabilir:

class Base
{
    //don't put anything related to child classes here,
    //unless it is going to provide specific functionality
}

class Text extends Base
{
    public function CamelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }

    public function isCamelCase($string)
    {
        return ($string === $this->CamelCase($string));
    }
}

Ben dışarı statik çağırarak veya parent:: kullanarak çocuktan bir ebeveyn yöntemini çağırmak için bir yolu var olduğunu sanmıyorum. Ama soruyu yanlış anlama olabilir. Oğlu bir örneğini oluşturma (), iki nesne yaratmaz. Oğul baba ama hala bir nesne uzanır.

Eğer Oğul içinde bir Singleton ile baba () aramak için gidiyoruz, o zaman neden Oğlu onu uzatmak?