Php Veli Nesne

5 Cevap php

is there a way to traverse an object to get the parent object data? With "parent object" I don't mean the parent class, but literally object. Here an example, in a javascripty world :-) :

$parent->test = "hello world!";

$parent->child = new B();

Ben çocuk nesne ebeveyninden tüm verilere erişmek olsaydı harika olurdu:

class B{

//I know this doesn't exists, but it's what I wanted do do
    function B(){
        $this->parent = $this->parent();
        echo $this->parent->test; //it would ouput "hello world"
    }
}

For now my solution is to pass the parent object to the child (as a reference) or to make the parent global. Do you have any better solution?

Teşekkürler!

5 Cevap

Çağırmak için hiçbir yolu yoktur

$parent->test = "hello world!";
$parent->child = new B();

ve otomatik olarak B'deki $ üst başvuru var


Genellikle, sınıfları yapısı için dört yolu vardır:

1. Aggregate the parent object via Injection, e.g.

class B
{
     private $parent;

     public function __construct($parent) 
     {
         $this->parent = $parent;
     }

     public function setParent($parent) 
     {
         $this->parent = $parent;
     }

     public function accessParent() 
     {
        $this->parent->someMethodInParent();
     }
}

Nesne oluşturulduktan zaman bir ebeveyne sahip zorunda kaldığında yapıcı enjeksiyon kullanın. Bu has-a ilişki olduğunu ve bir çok gevşek bir bağlantı oluşturur. Orada B hiçbir kodlanmış bağımlılıkları, bu nedenle kolayca Mock unittesting ile örneğin, Veli örneğini takas edebilirsiniz. Dependency Injection kullanarak kod daha rahat yapacaktır.

Senin usecase olarak, B oluştururken $parent B'ye geçmek istiyorum:

$parent->child = new B($parent);

2. Use Composition

class B
{
     private $parent;

     public function __construct() 
     {
         $this->parent = new Parent;
     }

     public function accessParent() 
     {
        $this->parent->someMethodInParent();
     }
}

Bu aynı zamanda bir has-a ilişki, ancak çiftler aynı zamanda varolan Veli örneği değil B. Veli sınıf, ama yeni bir örneği. Ifadeler itibaren ben bir ebeveyn çocuk tarafından oluşturulan olması biraz tuhaf buluyorum. Bağımlılık kök sınıfın dışında var kabul edilmez bir sınıf olduğunu, ama onu temsil olayın bir parçası olduğunda, bu kullanın.

$ Ebeveyn bir Singleton olduğu sürece usecase için, orada $parent->child = new B(); yapmanın bir yolu yoktur ve bu yaklaşımı kullanırken ne ebeveyn biliyorum. Eğer öyleyse, Singleton örneği alabilir, örneğin Parent::getInstance() ne istediğinizi elde, ama Singletons herkesin favori desen, örneğin olmadığını unutmayın test etmek zor.

3. Use Inheritance

class B extends Parent 
{
    public function accessParent() 
    {
        $this->someMethodInParent();
    }
}

Bir is-a ilişkisi oluşturmak Bu şekilde. Ana sınıfında, (ancak belirli bir örneğinin) tüm kamu ve korumalı yöntemleri ve özellikleri B mevcut olacak ve B örneğinin $this anahtar kelime kullanarak erişebilirsiniz.

Lütfen usecase için, tüm Veli bir örneğini olması gerekmez gibi bu yaklaşım, çalışmıyor, ancak oluşturulan olduğunda B Veli şeyi kapsülleyen

$b = new B;

4. Use global keyword

class B extends Parent 
{
    private $parent;

    public function __construct() 
    {
        global $parent;
        $this->parent = $parent;
    }

    public function accessParent() 
    {
        $this->parent->someMethodInParent();
    }
}

Geçerli kapsam içine global anahtar kelime ithalatı global değişkenler. Genel olarak, you should avoid using the global keyword OO bağlamda, ancak yukarıdaki diğer üç yöntemden birini, tercihen birinci birini kullanabilirsiniz. Bir dil bir özellik olsa da, bunun üzerine kaşlarını çattı - nasıl ilkine sonraki en yakın şey, örneğin olmasına rağmen

$parent->child = new B();

Her neyse, bu yardımcı olur umarım.

Çocuğa ebeveyn geçen daha iyi bir çözümdür. Bu biraz istenmeyen simbiyotik ilişki olsa.

) O bir nitelik var nesnenin herhangi bir bilgiye sahip (B olmalıdır? Daha değil olasılıkla. Bunlar sadece gevşek bileşim ile ilişkilidir.

Neden B () o ana var bir özellik olması gerekiyor? Eğer B, bu uygulama için () veya ebeveyn parçası olmalıdır gerekiyor?

Belki de bazı durumlarda yararlı olabilir: o çok erken kurucu içinde çocuğu olarak parent nesnesi getirmek, ama bir adım daha gelmez. Bu non-mevcut yöntemi durdurmak için yeteneği ile oynar:

class ParentClass
{
    const CHILD_PROPERTY_NAME = 'child';
    public $data = 'Some data';

    public function
    __set($property_name, $property_value)
    {
        if ($property_name == self::CHILD_PROPERTY_NAME)
        {
            $property_value->set_parent_object($this);
        }
    }
}


class ChildClass
{
    private $parent_object = null;

    public function
    set_parent_object($object)
    {
        $this->parent_object = $object;
        echo $this->parent_object->data;
    }

}


$p = new ParentClass();
$p->child = new ChildClass();

Bu irade çıkış Some data

Hayır.

Sen $ this kullanarak üst sınıftan değişkenleri erişebilirsiniz:

<?php
class A {
    public function __construct()
    {
        $this->foo = 'hello';
    }
}

class B extends A {
    public function printFoo()
    {
        echo $this->foo;
    }
}

$b = new B();
$b->printFoo();
?>

PHP böyle bir şey yok, eminim.

Çocuğa ebeveyn-nesne geçen çözüm en iyi çözümdür, ben düşünüyorum. Aynı çocuğa sahip birden fazla anne önlemek için sadece çocuğun yapıcısı içinde Veli-özelliğini ayarlamak için düşünmelisiniz.