Gli oggetti mantengono l'identità in tutte le condizioni di non clonazione in PHP?

2

PHP 5.5

Sto facendo un sacco di passaggi di oggetti con l'assunto che manterranno tutte le loro identità - che qualsiasi modifica apportata ai loro stati dai metodi di altri oggetti continuerà a essere vera in seguito. Sto assumendo correttamente?

Darò qui la mia struttura di base.

class builder {
  protected $foo_ids = array(); // set in construct
  protected $foo_collection;
  protected $bar_ids = array(); // set in construct
  protected $bar_collection;
  protected function initFoos() {
    $this->foo_collection = new FooCollection();
    foreach($this->food_ids as $id) {
      $this->foo_collection->addFoo(new foo($id));
    }
  }
  protected function initBars() {
    // same idea as initFoos
  }
  protected function wireFoosAndBars(fooCollection $foos, barCollection $bars) {
    // arguments are passed in using $this->foo_collection and $this->bar_collection
    foreach($foos as $foo_obj) { // (foo_collection implements IteratorAggregate)
      $bar_ids = $foo_obj->getAssociatedBarIds();
      if(!empty($bar_ids) ) {
        $bar_collection = new barCollection(); // sub-collection to be a component of each foo
        foreach($bar_ids as $bar_id) {
          $bar_collection->addBar(new bar($bar_id));
        }
        $foo_obj->addBarCollection($bar_collection);
        // now each foo_obj has a collection of bar objects, each of which is also in the main collection. Are they the same objects?
      }
    }
  }

}

Ciò che mi preoccupa è che foreach funzioni presumibilmente su una copia dei suoi array. Voglio tutti gli oggetti $ foo e $ bar per mantenere le loro identità indipendentemente da quale oggetto di raccolta $ diventano parte di. Ha senso?

EDIT: la mia comprensione è che l'utilizzo della parola chiave clone è l'unico modo per copiare realmente un oggetto in PHP 5+. In pratica, l'operatore di assegnazione crea semplicemente un altro riferimento allo stesso oggetto. Spero che anche i valori di ritorno e foreach funzionino in questo modo.

    
posta Buttle Butkus 08.06.2014 - 04:57
fonte

1 risposta

1

No, non sono le stesse barre, poiché stai chiamando new . Inoltre, non vedo che $bars venga utilizzato ovunque in wireFoosAndBars .

Utilizza le esatte istanze "associate" da $bars quando costruisci la nuova raccolta e saranno gli stessi oggetti.

Hai ragione in quel clone è l'unico modo per fare una copia di un oggetto. La modifica delle proprietà di un oggetto, indipendentemente da come indirettamente, indipendentemente dal fatto che la proprietà sia un array o meno, modificherà sempre la proprietà in quell'oggetto.

Non è necessario utilizzare i riferimenti per gli oggetti, è superfluo.

$foo = new Foo(); $foo->x = []; function doSomething($object) { $object2 = $object; $object2->x[0] = 'hello'; } doSomething($foo); var_dump($foo->x); // array(0=>'hello')

    
risposta data 30.06.2014 - 03:01
fonte

Leggi altre domande sui tag