PDA

View Full Version : [PHP] Dubbio su esempio con operatore clone...help me :-/


e-commerce84
03-03-2010, 23:13
Ciao,
mi stò studiando l'ottima guida di PHP OO di HTML.it, ho fatto la lezione che riguarda l'operatore clone.

Questo è il codice:


<?php

class Foo {
public $foo = 10;
}

class A{

// PROPRIETÀ:
public $a = 10;
public $b = 20;
public $c = 30;
public $d; // E' inizialmente dichiarata senza valore specificato

/* COSTRUTTORE: Quando costruisce l'oggetto istanza di Aassegna a d il
* riferimento ad un nuovo oggetto istanza di Foo */
public function __construct() {
$this->d = new Foo();
}

}

$obj1 = new A(); // Costruisce un nuovo oggetto istanza di A
$obj2 = clone $obj1; // Mette in obj2 il riferimento aduna copia clonata di obj2

/* Modifica il valore della variabile foo dell'oggetto a cui si riferisce la
* proprietà e dell'oggetto clonato obj2 */
$obj2->e->foo = 20;

/* Stampa il valore della variabile foo dell'oggetto puntato dalla proprietà e
* dell'oggetto clonato obj2 */
echo $obj2->e->foo . "<br>";

/* Stampa il valore della variabile foo dell'oggetto puntato dalla proprietà e
* dell'oggetto originale obj1: è stato modificato anche l'originale */
echo $obj1->e->foo . "<br>";

?>


La cosa strana è che se vado a far girare tale script mi viene visualizzato solo uno dei due risultati degli echo finali (questo: echo $obj2->e->foo . "<br>";) mentre quello riferito alla proprietà foo dell'oggetto istanza della classe Foo il cui riferimento è nella proprietà e dell'oggetto obj1 non viene visualizzato...come mai? eppure...io creando l'oggetto il cui riferimento è in obj1 automaticamente con il suo costruttore creo anche l'oggetto istanza di foo e ne attribuisco il riferimento al relativo campo foo....mi pare molto strano...

Spero di essere stato abbastanza chiaro nello spiegarlo...ma basta far girare questo semplice codice per capire...come mai? qualche idea? E' pari pari alla guida tra l'altro...mi sfugge qualcosa?

Grazie

bobbytre
04-03-2010, 00:07
utilizzi ->e

quando dentro il costruttore invece è ->d

prova la classe A cosi :

class A{

// PROPRIETÀ:
public $a = 10;
public $b = 20;
public $c = 30;
public $d; // E' inizialmente dichiarata senza valore specificato

public $e;
/* COSTRUTTORE: Quando costruisce l'oggetto istanza di Aassegna a d il
* riferimento ad un nuovo oggetto istanza di Foo */
public function __construct()
{
$this->e = new Foo();
}

}