Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

    Ma come si istanziano oggetti in modo dinamico ?

    a me interesserebbe creare una lista di oggetti diversi a seconda di una determinata condizione
    ma per motivi che non vado a spiegare per troppa complessita' possiedo i nomi delle classi
    in una variabile.

    chiaramente fare
    Codice PHP:
    $className "myClass";
    $myObj = new $className(); 
    non funziona c'e' qualche funzione strana che mi ritorna il tipo oggetto da utilizzare nella new passandogli una stringa ?

    grazie

    Andrea

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

  3. #3
    Veramente a me funziona anche così, eventualmente prova a togliere le parentesi tonde

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Ho fatto alcune prove e non funziona
    ecco un esempio di quello che mi servirebbe

    Codice PHP:
    class Class1 {
        public 
    $str "";
        public function 
    __construct($strin) {
            
    $str $strin;
        }
        
        public function 
    toString() {
            echo 
    "Class1 ".$this->str."
    \n"
    ;
        }
    }

    class 
    Class2 {
        public 
    $str "";
        public function 
    __construct($strin) {
            
    $str $strin;
        }
        
        public function 
    toString() {
            echo 
    "Class2 ".$this->str."
    \n"
    ;
        }
    }

    $strClass "Class1";
    $myObj = new $strClass("prova"); //in questo caso istanza l'oggetto ma non c'e' verso di passare parametri al costruttore
    $myObj->toString();


    $myObj call_user_func('Class2',"prova");// in questi casi da  errore
    $myObj = new call_user_func('Class2',"prova");
    $myObj =  call_user_func('Class2','__construct'"prova");
    $myObj->toString(); 
    altre idee ?


    Andrea

  5. #5
    Codice PHP:
    class Class2 
        public 
    $str ""
        public function 
    __construct($strin) { 
            
    $this->str $strin
        } 
         
        public function 
    toString() { 
            return 
    "Class2 ".$this->str."
    \n"

        } 

    $className"Class2";
        
    function 
    Factory($className){
           
    $reflectionObj = new ReflectionClass($className);
        
    $arguments func_get_args();
        
    array_shift($arguments);    
        return  !
    is_null($reflectionObj->getConstructor()) ? $reflectionObj->newInstanceArgs($arguments) : $reflectionObj->newInstance();
    }
    $myClassFactory($className,'Say Hello');
    var_dump($myClass->toString()); 
    Revisited and just nicked by devpro





    $str = $strin; OCCHIO !
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    che canocchia

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Fantastico ci sono riuscito il problema non era dove pensavo.

    grazie a tutti

    Andrea

  8. #8
    Originariamente inviato da andreamk
    Fantastico ci sono riuscito il problema non era dove pensavo.

    grazie a tutti

    Andrea
    Se sprechi due parole ci fai un piacere


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

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Lol non saranno due ma ben felice di spiegare anche se sara' piu difficile far capire
    la struttura che il problema.
    n.b. scrivo gli esempi a mano libra quindi perdonate se ci sono errori sintattici ma il mio fine e' far capire la struttura non produrre un codice funzionante.

    Ho una classe elemento e una classe insieme che ha una lista di elementi

    Codice PHP:
    class elemento {
          public 
    $dato;
          public 
    __construct ($in) {
                  
    $this->dato $in;
          }
    }

    class 
    lista  {
         public 
    $listadati = array();

         public 
    __construct ($num) {
                for (
    $i 0$num$i ++) {
                        
    $this->listadati[] = new elemento($num);
                }
         }

    ora crea altri due classi che ereditano le prime elementoHtml e listaHtml
    Codice PHP:
    class elementoHtml extends elemento {

          public 
    __construct ($in) {
                  
    parent::__construct($in);
          }

           public 
    toHtml() {
               return 
    "<span>$this->dato</span>";
           }
    }

    class 
    listaHtml extends lista {
         public 
    __construct ($num) {
            
    parent::__construct($num);
         }
         
         public 
    toHtml() {
             foreach (
    $this->listadati as $celem) {
                  echo 
    $celem->toHtml()."
    \n"
    ;
             }
         }


    il mio obbiettivo e' che il costruttore lista allocasse una array di obj elemento se la classe
    era lista e elementoHtml se la classe era listaHtml.

    e avevo fatto cosi
    Codice PHP:
    class lista  {
         private 
    $listaType;
         public 
    $listadati = array();

         public 
    __construct ($num) {
                if (
    strcmp(__CLASS__,"lista")) {
                     
    $this->listaType "elemento";
                } else  {
                     
    $this->listaType "elementoHtml";
                }

                for (
    $i 0$num$i ++) {
                        
    $this->listadati[] = new $listaType($num);
                }
         }

    ma e' sbagliato perche' __CLASS__ e' sempre lista io pensavo invece che facesse riferimento all'oggetto istanziato quindi cambiasse a seconda dei casi.
    Alla fine ho risolto cosi ...

    Codice PHP:
    class lista  {
         private 
    $listaType;
         public 
    $listadati = array();

         public 
    __construct ($num,$ltype "elemento") {

                
    $this->listaType $ltype;
                for (
    $i 0$num$i ++) {
                        
    $this->listadati[] = new $listaType($num);
                }
         }
    }

    class 
    listaHtml  extends lista {
         public 
    __construct ($num) {
            
    parent::__construct($num,"elementoHtml");
         }
         
         public 
    toHtml() {
             foreach (
    $this->listadati as $celem) {
                  echo 
    $celem->toHtml()."
    \n"
    ;
             }
         }


    cosi funziona pero magari ci sono metodi migliori se hai idee in merito

    Andrea

  10. #10
    cosi funziona pero magari ci sono metodi migliori se hai idee in merito
    dai un occhio qui


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

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.