PHP5 Sınıflar: Bir kompoze sınıf devralmasını?

5 Cevap php

Ben işe aşağıdaki almak için çalışıyorum, ama ben bir kayıp değilim ...

class Foo {
    public $somethingelse;

    function __construct() {
    	echo 'I am Foo';
    }
    function composition() {
    	$this->somethingelse =& new SomethingElse();
    }
}
class Bar extends Foo {
    function __construct() {
    	echo 'I am Bar, my parent is Foo';
    }
}
class SomethingElse {
    function __construct() {
    	echo 'I am some other class';
    }
    function test() {
    	echo 'I am a method in the SomethingElse class';
    }
}

Ne yapmak istiyorum sınıfı Foo içindeki somethingelse sınıfının bir örneğini oluşturmak olduğunu. Bu =& kullanarak çalışır. Ben sınıf ile Bar sınıf Foo uzatmak Ama, ben çocuk ebeveyn sınıftan tüm verilerin özelliklerini ve yöntemleri miras düşündüm. Ancak, $this->somethingelse çocuk sınıf Bar'da çalışmıyor gibi görünüyor:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$bar = new Bar(); // I am Bar, my parent is Foo
$bar->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

Bu nedenle, bu tür bir şekilde miras mümkün değildir? Ve ben orada kullanmak istiyorsanız ben sınıf Bar içinde sınıf somethingelse yeni bir örneğini oluşturmak gerekir? Ya ben bir şey eksik?

Yardımlarınız için şimdiden teşekkür ederiz.

5 Cevap

Ben çocuk ebeveyn sınıftan tüm verilerin özelliklerini ve yöntemleri miras düşündüm.

Bu doğrudur - sınıf çocuk ebeveyn sınıftan statik değişkenler ve statik yöntemleri devralır. Ayrıca, herhangi bir alt nesneler statik ve örnek değişkenler ve yöntemleri miras olacaktır.

Eğer mevcut sınıf yapısı ile istediklerini almak için bir olasılık şudur:

$bar = new Bar();
$bar->composition();// here you are calling the parent method, sets instance var $somethineelse
$bar->somethingelse->test();// now you can call methods

Çocuk durumlarda (bu durumda bir nesne olarak) bir değişkeni miras gerçekleştirmek için başka bir yol şöyle olurdu:

class Foo {
    protected $somethingelse;
    public function __construct() {
        $this->somethingelse = new SomethingElse();
    }
}

class Bar extends Foo {
    public function __construct() {
        parent::__construct();
        // now i've got $somethingelse
    }
 }

For a very good overview of classes and objects in PHP 5, take a look here: http://php.net/manual/en/language.oop5.php Make sure to read it all, maybe a couple times if OO is new for you.

bar foo devralınan somethingelse adlı bir üye değişkeni vardır.

Nesne ve sınıf kapsamı karıştırma.

Eğer gerçekten tarif etkiyi elde etmek istiyorsanız, size değişken statik yapmak zorunda, bu yüzden onun bağlam temelli sınıf

İlk olarak, statik ve örnek değişkenler arasındaki ayrım var. Statik değişkenler, bir sınıfın tüm örnekleri arasında paylaşılır, örnek değişkenler değildir.

Eğer Foo ve Bar her örneği aynı somethingelse-örneği var isterseniz $ somethingelse statik yapmak zorunda:

public static $ somethingelse

ve Foo kompozisyon işlevini değiştirmek gerekir:

function composition() {
    self::$somethingelse = new SomethingElse();
}

To access this static field you can do the following: $foo = new Foo(); // I am Foo $foo->composition(); // I am some other class Foo:$somethingelse->test(); // I am a method in the SomethingElse class

$ Bar = new Bar (); // I am Bar, my parent is Foo Bar::$somethingelse->test(); // I am a method in the SomethingElse class

Eğer Foo ve Bar her örneğini isterseniz eklemeniz gerekir Eğer kodu kullanabilirsiniz kendi somethingelse örneği var, ama

$ Bar-> kompozisyon ()

önce $ bar-> somethingelse-> test ();

İşte ile çünkü

$ Bar = new Bar ();

Eğer Bar tamamen yeni bir örneği oluşturulur ve örnek bir $ somethingelse özelliği vardır, ancak henüz henüz belirlenmedi. Yani bunu ayarlamak için) (kompozisyon aramak gerekir.

Her Foo ve Bar aynı somethingelse-örneği var ise gerekli belleği azaltır, çünkü, bunun yerine statik sürümünü kullanmanız gerekir.

Bu size yardımcı olur umarım. Aksi halde ben daha da açıklamak için çok mutluyum.

Sınıflar payı nitelikler nesneleri paylaşmak anlamına gelmez söyleyerek attribute values.

Diğerleri de belirtildiği gibi, örnekleri ile sınıfları kafa karıştırıcıdır.

Görseydiniz Not, aynı hatayı almak istiyorum:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$foo2 = new Foo(); // I another Foo
$foo2->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

Daha az soyut sınıfların düşünüyorum. Örneğin, bir sınıf, bir üst sınıf "Kişi," olabilir "Royalty."

Sonra görseydiniz:

$me = new Person(); $me->firstName = "Thomas"

$ PrinceCharles = new Royalty ();

Sen $ princeCharles olmasını istemem firstName eşit öznitelik "Thomas," ve size princeCharles-> firstName $ ayarlamak istiyorsanız, size $ benim firstName niteliğinin değerini değiştirmek için değil yapmak.

$ Me $ ve princeCharles Hem bir nitelik 'firstName' var, ama biz value Bu niteliğin payı yok.

Türetilmiş sınıf kurucusu içinde üst sınıf kurucusunu arayacak eğer ben senin sorunun çözülmüş olacağını düşünüyorum. Bu veri üyeleri miras ile ilgili sorunlar olduğunda bu yüzden akılda tutmak PHP varsayılan olarak oluşmaz.

class Bar extends Foo { public function __construct() { parent::__construct();

}

}