Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913

    Variabile che viene passata come referenza?

    Per prima cosa il codice
    Codice PHP:
    /* Molto semplificato */
    namespace tags;

    abstract class 
    Tag {
        protected 
    $content = array();

        private function 
    parse ($var) {
            if (
    /* $var è un'istanza di una classe "estesa" dalla classe Tag */) return $var;
            
    /* Converto $var in una stringa e ritorno il valore convertito */
        
    }

        public function 
    add_content() {
            
    /* Argomenti passati alla funzione (possono essere un qualsiasi numero) */
            
    $args func_get_args();
            foreach (
    $args as $argoument) {
                
    /* Aggiusto i valori passati e li metto nell'array $content */
                
    $this->content[] = $this->parse($argoument);
            }
        }
    }

    class 
    extends Tag {/* ... */
    Codice PHP:
    $p = new tags\p;$p2 = new tags\p;

    $p->add_content($p2);$p2->add_content("aaa""bbb");

    print_r($p); 

    Per qualche motivo nell'array $content di $p il valore relativo a $p2 si aggiorna anche dopo essere stato settato...
    Nel senso che dal print_r vedo che $p->$content[0]->$content è un array che contiene "aaa" e "bbb", anche se sono stati settati dopo che $p2 è stato aggiunto a $p->$content...

    Un po' come se lo avessi passato come referenza, ma i valori restituiti da func_get_args() non sovrebbero esserlo... (e anche il parametro della funzione parse è $var, non &$var)...
    Ultima modifica di tampertools; 10-06-2014 a 18:50
    No

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Non ho capito a pieno il perché, però ho trovato una soluzione
    Codice PHP:
    abstract class Tag {
        protected 
    $content = [];


        private function 
    parse ($var) {
            return (
    $var instanceof Tag) ? clone $var : (string)$var;
        }


        public function 
    add_content() {
           
    $this->content[] = array_map([$this,'parse'],func_get_args());
        }

    Clonando l'oggetto non lo passa come referenza, anche se ripeto non ho capito perché lo passa così, è un easter egg del php

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    è un easter egg del php



    Grazie per la soluzione, ora aspetto qualcuno che ci spieghi il perché
    No

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.