Php çoklu mirası elde etmek için herhangi bir yolu var mı?

6 Cevap php

Ben bir üst sınıf var Diyelim

class parent { }

.....

Bu üst üç alt sınıfı vardır

class child1 { }

class child2 { }

class child3 { }

ve bu çocuk sınıflar daha küçük parçalar gibi var

class child1subpar1 { }

class child1subpar2 {

       public function foo() {
          echo "hi";
       }

}

class child2subpar1 { }

class child2subpar2 { }

Şimdi, nasıl gibi bu bütünü özetlemek

class child1 extends child1subpar1, child1subpar2 { }
class child2 extends child2subpar1, childsubpar1 { }

class parent extends child1,child2,child3 { }

Ben onun sınıflarında yöntemlerini yürütmek ve böyle bir şey yapmak gerekiyor

$objparent = new parent; $objparent -> foo();

6 Cevap

Hayır, ama çoklu kalıtım genellikle kötü bir uygulama olarak kabul edilir. Bunun yerine kompozisyon tercih etmesi, böylece sadece size sınıf içinde miras istedim sınıfların örneklerini kullanabilirsiniz.

Ben tekrar gündeme baktığınızda Ve şimdi, bu bileşimin kullanılması gereken, hatta bir miras sorunu değil. Eğer bu sınıf ne bekliyoruz daha fazla ayrıntı verilmedi belki, biz daha doğru cevaplamak gerekir.

GÜNCELLEME:

Eğer kullanmak istiyorum hangi bu sınıfların 'yöntemi her biri için bir yöntem oluşturmak gerekir - bu Cephe tasarım deseni denir. Ya da belki bu gibi iç nesnelerin yöntemleri çağırabilir farkında değildir:

$parent->subObject->subSubObject->wantedMethod();

Cephe desen:

http://en.wikipedia.org/wiki/Facade_pattern

in your case facade wouldn't be anything else than creating one class and define every single method you want to use, and inside that method calling any method of any of your inner instances. But i really don't see any benefit coming from this instead of calling instances and methods hierarchically

OOP hakkında gerçekten karışık konum gibi görünüyor.

Ebeveyn sınıfı, çocukların hiçbir bilinci vardır. Eğer bir çocuk sınıf yürütmek istiyorsanız, onun örneğini oluşturmak gerekiyor.

Çoklu miras da PHP (yanı sıra Java gibi diğer pek çok popüler dilde) izin verilmez.

Bu toplama bakarak değer olabilir - çocuk veya olay üst sınıfa küçük alt sınıf geçme. Ayrıca, size gerekli yöntemleri bir dizi için alt sınıfları zorlamak için uygulamak çoklu arayüzleri kullanabilirsiniz.

Ne yapıyoruz gerçekten geriye gitmektir. Kalıtım kod çoğaltılması olmadan nesneler üzerine ortak, paylaşılan işlevselliği ihsan kullanılır. Miras Parent adlı Çocuk, Ebeveyn Çocuk de yapabilirsiniz, yapabileceğiniz her şeyi gider, ancak (ebeveynin o extends işlevsellik) daha yapabilir.

class Parent {

    function everyoneCanDoThis() { }

}


class Child extends Parent {

    // I can implicitly use the everyoneCanDoThis() function

    function onlyChildrenCanDoThis() { }

}

Bu yukarıdan aşağıya bir yapı olduğundan, Ebeveyn belirli Çocuk güvenmemelisiniz. Veli yürütmek veya Çocuk işlevlerini aramıyor. Sadece you Bir Çocuk işlevleri çağırmak, ancak bu işlevler bir Veli sınıfından kalıtsal olabilir.

Eğer her nesne bir ebeveyn sınıfta yapabilmek için istediğiniz her şeyi koymak gerekir. Belirli bir nesneye sadece alakalı belirli işlevselliği bir Çocuk gider.

Çoklu kalıtım iyi nedenler için, PHP mümkün değil solucanlar farklı bir kutu olduğunu. Başka bir yerde burada önerildiği gibi miras temellerini olsun, geri kompozisyon geliyor. :)


Kompozisyon sadece birkaç nesneleri almak ve başka bir nesneye onlara başvurular tutmak anlamına gelir. Bu nesnelerin her biri ya bir ebeveyn sınıftan miras olmayabilir ve onlar hala tek nesneleri konum gibi, miras ile ilgisi yoktur.

class ComposedObject {

    private $part1 = null;
    private $part2 = null;

    public function __constructor() {
        $this->part1 = new Part1();
        $this->part2 = new Part2();
    }

    public function doTask() {
        return $this->part1->doSomeTask();
    }

    public function doOtherTask() {
        return $this->part2->doSomeOtherTask();
    }

}

ComposedObject, herhangi bir özelliğe sahip kendisi miras veya başka değildir. Ama her bazı işlevler taşıyan iki diğer nesneleri tutar. "Parçalar" işlevselliğini doğrudan maruz kalabilirsiniz, bu yüzden $composedObject->part1->doSomeTask(), onlar örnekteki gibi kapsüllü olabilir gibi adlandırılan konum, bu yüzden $composedObject->doTask() gibi deniyor ve vardır dahili temsilci veya __call() kandırmaca otomatik olarak "parçalar" birine oluşan nesne çağırdı görevlerimi, bazı kullanabilirsiniz. Bu olsa çoklu miras olarak aynı sorun var; iki "parça" ikisi aynı adı taşıyan bir yöntem içeriyorsa, hangisini diyorsunuz?

Başkalarına +1. Gerçekten geriye o var. Çocuklar DAİMA ebeveynleri uzanır.

But there is even something that can act kind of like multiple inheritance in PHP: The Decorator Pattern. I wrote an article about it on my blog here.

A sınıfı biraz daha farklı bir şey, birden fazla arayüz, uygulayabilirsiniz.

Eğer bir ebeveynden miras, size bir şey geçersiz tercih sürece her şeyi almak, artı ek daha spesifik şeyler ekleyerek uzatabilirsiniz, ama ebeveyn çocuk hakkında hiçbir şey bilmiyor gerekir.

Bir arabirim uygulamak, arayüz yöntemlerini tanımlar ama bunları uygulamıyor. Onu uygulamak için size kalmış. Sürece onlar arayüz söylediklerini takip olarak istiyorum ancak farklı sınıflar arabirim yöntemleri uygulayabilirsiniz.

Kalıtım gereksiz yere eğilimindedir ve kötü programlar yol açar. Eğer çözmeye çalıştığınız sorun anlattı Belki de, bizden biri size sınıfları yapısı nasıl hatırlatıyoruz.

Php Arayüzü kullanarak belki soru çözmek.