Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Ereditarietà metodo magico __toString

    Ciao a tutti, io vorrei che fare una cosa di questo tipo:
    Codice PHP:
    class Foo {
        public function 
    __toString() {
            return 
    __CLASS__;
        }
    }

    class 
    Bar extends Foo {}

    $b = new Bar();
    echo 
    $b
    Io mi aspettavo che stampasse Bar mentre invece stampa Foo, cioè eredita il metodo __toString però il metodo resta "collegato" alla classe Foo, chi mi sa dare una spiegazione??
    Coltiva Linux, Windows si pianta da solo!

  2. #2
    __toString
    The __toString method allows a class to decide how it will react when it is converted to a string.
    E' un metodo magico della classe, non dell'oggetto. Il che significa che deve essere la classe (non attraverso l'ereditarietà) ad implementarlo.

  3. #3
    Codice PHP:
    class Foo 
        public function 
    __toString() { 
            return 
    get_class($this); 
        } 

    class 
    Bar extends Foo {} 
    $b = new Bar(); 
    echo 
    $b
    E' __CLASS__ che è legato alla classe
    non il metodo __toString.

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  4. #4
    Dite che questa è una buona soluzione
    Codice PHP:
    class Foo {
        public function 
    __toString() {
            return 
    get_class($this);
        }
    }

    class 
    Bar extends Foo {
        public function 
    __toString() {
            return 
    parent::__toString();
        }
    }

    $b = new Bar();
    echo 
    $b
    Coltiva Linux, Windows si pianta da solo!

  5. #5
    Ora mi succede un'altra cosa strana:
    Codice PHP:
    class Foo {
        public function 
    __toString() {
            
    var_dump(get_class($this));          //L'output è Bar
            
    var_dump($this);                        //L'output si riferisce correttamente a Bar
            
    var_dump(get_object_vars($this)); //STRANO: L'array risultante è vuoto mentre mi aspetterei che contenesse i membri di Bar!
            
    return "test";
        }
    }

    class 
    Bar extends Foo {
        public function 
    __toString() {
            return 
    parent::__toString();
        }
    }

    $b = new Bar();
    echo 
    $b
    Coltiva Linux, Windows si pianta da solo!

  6. #6
    Codice PHP:
    class Foo 
        public function 
    __toString() { 
                            
          return  
    implode(get_object_vars($this)); 
        } 


    class 
    Bar extends Foo 
        public 
    $one 'One';
        protected 
    $two 'Two';
        private 
    $three 'Three';


    $b = new Bar(); 
    echo 
    $b


    tutto regolare


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    Originariamente inviato da whisher
    Codice PHP:
    class Foo 
        public function 
    __toString() { 
                            
          return  
    implode(get_object_vars($this)); 
        } 


    class 
    Bar extends Foo 
        public 
    $one 'One';
        protected 
    $two 'Two';
        private 
    $three 'Three';


    $b = new Bar(); 
    echo 
    $b
    tutto regolare


    Perchè non stampa Three? Anche se è privata viene richiamata dall'interno di Bar perchè è come scrivere __toString in Bar. Se scrivo esplicitamente il __toString dentro Bar legge anche Three.
    Coltiva Linux, Windows si pianta da solo!

  8. #8
    perché è privato ed il metodo è richiamato da un metodo esterno a quella classe
    http://it2.php.net/get_object_vars

    Gets the accessible non-static properties of the given object according to scope.
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #9
    Si ma il metodo è ereditato e quindi è come se fosse nella classe figlio???
    C'è qualcosa che mi sfugge.
    Coltiva Linux, Windows si pianta da solo!

  10. #10
    mmm mi sa che hai un pò di confusione

    gli elementi privati sono ESCLUSIVAMENTE della classe mentre quelli protected, per l'appunto, possono essere utilizzati anche all'interno delle classi ereditate o padri (anche se in una struttura logica non ha senso che una proprietà presente nella classe figlio venga usata dal padre ... dovrebbe essere dichiarata nella padre per l'appunto come protected)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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.