Strano funzionamento di clone

Ciao, m'è successo una cosa singolare:

chiamando il costruttore di una classe con

$pippo=new $topolinia

mi chiama automaticamente il clone dal costruttore. definito come:

public __construct($arcArr){
                      ...[i]istruzioni1[/i]
                      echo "A <br />";
}
public function __clone{
                       ...[i]istruzioni2[/i]
                      echo "B <br />";
}

$pippo=new Topolinia;
A
B

da cosa potrebbe dipendere?

A_ndrea

inviato 9 anni fa
cybaSsh
X 0 X

potresti riportare un esempio completo così lo provo? Che versione di PHP stai usando?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ciao,

  La versione è la 5.2.2.  Difatti si è presentato dal passaggio dalla versione 4.1.16(credo...comunque 4.xx.xxx) a quella precedemente detta.

riportare il codice non è facile ...sono più di 3000 righe di codice...

posso postare il costruttore della classe, diverso dalle altre, che popola gli attributi da un record.

public function __construct($recRif){
      $i=0;
      $numOfArgs=func_num_args();
      
      if (!isset($recRif)){
         echo "Errore Pps<br />";
      }
      
      
      if ($numOfArgs<>0){
         while (list($chiave,$valore)=each($recRif)){
            $this->campi[$chiave]=$valore;
            $i++;
         }
      }
   

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

Probabilmente quello che sto per scrivere lo conosci, ma non si sa mai, da php 4 a 5 sono cambiate un sacco di cose relative agli oggetti (e sinceramente con php4 non li avevo visti).

Quello che mi sfugge è perchè crei il nuovo oggetto prima così $pippo=new $topolinia e poi $pippo=new Topolinia; è solo un errore di battitura?

risposto 9 anni fa
LonelyWolf
X 0 X

Scusa(te)mi, era un errore di battitura :-[

immagino infatti di non aver rispettato qualche feuters del nuovo php, non capisco quale... e mi rendo conto che espresso così non si può capire 'come mai'... ci si prova ;)

Andrea

risposto 9 anni fa
cybaSsh
X 0 X

Potresti provare a inserire un log delle operazioni nella classe così da capire che serie di operazioni vengono eseguite?

Magari solo per le funzioni incriminate in modo da impiegarci poco tempo.

Così poi guardando il log vedi cosa sta succedendo istanziando l'oggetto.

una cosa tipo:

un metodo interno all'oggetto che riceve come parametro la descrizione dell'operazione apre il file di log, scrive e chiude il file

in ogni metodo poi devi solo aggiungere la chiamata con il relativo parametro.

+ o -:

//dichiarazione della classe
public function __construct($recRif){
       log("inizio costruttore");
       $i=0;
       $numOfArgs=func_num_args();
       if (!isset($recRif)){
          echo "Errore Pps<br />";
       }
       if ($numOfArgs<>0){
          log("inizio ciclo");
          while (list($chiave,$valore)=each($recRif)){
                $this->campi[$chiave]=$valore;
                $i++;
          }
       }
}

public function __clone{
       log("inizio clone");
       //...[i]istruzioni2[/i]
                      echo "B <br />";
}

function log($evento){
         fopen //in append
         fwrite
         fclose
         return 0;
}   
risposto 9 anni fa
LonelyWolf
X 0 X

quindi confermate che __clone viene chiamato anche con la new?

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Io non posso confermarlo, come faccio a provare? Mi fido di quanto ha scritto nell'esempio.

Credo che per qualche motivo venga chiamato il costruttore nel primo caso e il __clone quando si istanzia un nuovo oggetto anche se non so perchè.

Con un log delle operazioni dovremmo capire cosa succede.

risposto 9 anni fa
LonelyWolf
X 0 X

per quel che mi è accaduto, dico di si.

avevo un incremento sul metodo di __clone ed il record aveva la variabile$x ad 1. "costruito" l'oggetto $ogg1 aveva $ogg1->x2 e facendo il clone,$ogg2 ,  avevo $ogg2->x a 3 e successivamente a $ogg2->x a 4

altro non so dire.

Andrea

risposto 9 anni fa
cybaSsh
modificato 9 anni fa
X 0 X

ps:

non so, ma è come se $ogg2 mantiene il riferimento ad $ogg1(tra l'altro).... no?

risposto 9 anni fa
cybaSsh
X 0 X

cosa c'è dichiarato come static nella classe?

risposto 9 anni fa
LonelyWolf
X 0 X

cybaSsh dovreti riportare le parti salienti della classe in esame altrimenti non possiamo vedere/testare il funzionamento  :dunno:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda