Condivisione di oggetti tra 2 classi

3

modifica : penso che l'iniezione di dipendenza sia l'approccio migliore.

Sto facendo fatica a comprendere la possibilità di condividere un oggetto tra due classi. Voglio essere in grado di creare solo un'istanza dell'oggetto, commonlib nella mia classe main e quindi avere le classi, foo1 e foo2 , per poter condividere reciprocamente le proprietà del commonlib. commonlib è una classe di terze parti che ha una proprietà Queries che sarà aggiunta a in ogni classe figlia di bar . Questo è il motivo per cui è fondamentale creare solo un'istanza. Creo due query separate in foo1 e foo2 .

Questa è la mia configurazione:

abstract class bar{
//common methods
}


class foo1 extends bar{
//add query to commonlib
}

class foo2 extends bar{
//add query to commonlib
}

class main {

    public $commonlib = new commonlib();

    public function start(){
    //goal is to share one instance of $this->commonlib between foo1 and foo2 
    //so that they can both add to the properites of $this->commonlib (global
    //between the two)

    //now execute all of the queries after foo1 and foo2 add their query
    $this->commonlib->RunQueries();

}



}
    
posta Justin 10.06.2012 - 00:21
fonte

2 risposte

4

Metodo 1: utilizza una proprietà in bar

Crea commonlib una proprietà in bar e dichiara getter e setter. Condividi quell'istanza di commonlib dichiarata in main tra foo1 e foo2 .

abstract class bar {
    protected $commonlib;

    public function __get($property) {
        if (property_exists($this, $property)) {
            return $this->$property;
        }
    }

    public function __set($property, $value) {
        if (property_exists($this, $property)) {
            $this->$property = $value;
        }
        return $this;
    }
}


class foo1 extends bar{
    public function someMethod() {
        $this->commonlib->addQueries($fromSomeWhere);
    }
}

class foo2 extends bar{
    public function someMethod() {
        $this->commonlib->addQueries($fromSomeWhereElseAndInADifferentWay);
    }
}

class main {

    public $commonlib = new commonlib();

    public function start(){
        //goal is to share one instance of $this->commonlib between foo1 and foo2 
        //so that they can both add to the properites of $this->commonlib (global
        //between the two)
        $foo1 = new foo1();
        $foo1->commonlib = $commonlib;

        $foo2 = new foo2();
        $foo2->commonlib = $commonlib;

        $foo1->someMethod();
        $foo2->someMethod();

        //now execute all of the queries after foo1 and foo2 add their query
        $this->commonlib->RunQueries();

}

Modifica:

Approach 2: Passa la lib comune come argomento e metti solo algos in foo1 e foo2

Così,

class foo1 {
    public function addQueries($commonlib) {
        $commonlib->addQueries($fromSomeWhere);
    }
}

class foo2 {
    public function addQueries($commonlib) {
        $commonlib->addQueries($fromSomeWhereElseAndInADifferentWay);
    }
}

class main {

    public $commonlib = new commonlib();

    public function start(){
        //goal is to share one instance of $this->commonlib between foo1 and foo2 
        //so that they can both add to the properites of $this->commonlib (global
        //between the two)
        $foo1 = new foo1();
        $foo2 = new foo2();

        $foo1->someMethod($commonlib);
        $foo2->someMethod($commonlib);

        //now execute all of the queries after foo1 and foo2 add their query
        $this->commonlib->RunQueries();

}
    
risposta data 10.06.2012 - 00:54
fonte
-2

Singleton non è lo schema che stai cercando?

Il modello singleton consente di avere una sola istanza di un oggetto. Questa istanza può essere generalmente chiamata da ogni oggetto o funzione che ne ha bisogno e dato che è una singola istanza ogni modifica sarà accessibile ovunque.

    
risposta data 10.06.2012 - 01:24
fonte

Leggi altre domande sui tag