Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    autoload con spl_autoload

    Salve.
    Sto cercando di collegare le varie pagine di un lavoro con la cartelle dove sono contunute le classi in modo tale da non dover chiamare classe per classe singolarmente ma di far richiamare allo script automaticamente la classe di cui esso necessita. Per questo scopo sto utilizzando uno script (non mio) :
    Classe loader
    Codice PHP:
    class autoloader {
        public static 
    $loader;
        public static function 
    init()
        {
            if (
    self::$loader == NULL)
                
    self::$loader = new self();

            return 
    self::$loader;
        }

        public function 
    __construct()
        {
        
    spl_autoload_register(array($this,'myclass'));

        }
        public function 
    myclass($class)
        {
             
    set_include_path(get_include_path().PATH_SEPARATOR.$_SERVER['DOCUMENT_ROOT'].'/autoload_esempio_utilizzo/classe');

             
    spl_autoload($class);
        }

    }

    //call
    autoloader::init(); 
    Per testarlo utilizzo questa classe prova
    Codice PHP:
     class ClasseSaluto{
        public 
    $quale_saluto;
     public function 
    getSaluto ($quale_saluto){
       
    $this ->quale_saluto=  $quale_saluto;
          return  
    $this -> quale_saluto;
        }
     }
    class 
    SalutoTabella extends ClasseSaluto{

      public function 
    salutoDentroTab ($quale_saluto){
        
    $tabella="<table border='3'> \n <tr>\n<td>".parent::getSaluto($quale_saluto)."</td>\n</tr>\n</table>";
        return 
    $tabella;
    }

    e per richiamare il tutto:

    Codice PHP:
    require_once($_SERVER['DOCUMENT_ROOT'].'/autoload_esempio_utilizzo/loader.php');
    $salutami =new ClasseSaluto();

    print 
    $salutami -> getSaluto("ciao Bello"); 
    In questa maniera funziona ma se cerco di chiamare il metodo della classe figlio salutoDentroTab ottengo

    Codice PHP:
    Fatal error: Class 'SalutoTabella' not found in... 
    cioè la classe figlio non viene trovata.
    Ho trovato questa soluzione :

    Codice PHP:
    require_once($_SERVER['DOCUMENT_ROOT'].'/autoload_esempio_utilizzo/loader.php');
    $salutami =new ClasseSaluto();
    $salutami = new SalutoTabella();
    print 
    $salutami -> salutoDentroTab("ciao Bello"); 
    cioé chiamo prima la classe padre e poi quello figlio e cosi funziona ma non mi sembra la soluzione più adatta.
    Avete qualche suggerimento?
    <-------------------------------->
    Se non avessimo difetti, non ci farebbe tanto piacere trovarne negli altri.
    <-------------------------------->
    Andate sempre contro il vento...Solo così imparerete a volare...

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Invece è proprio così che funziona.

    Se crei un oggetto della classe padre, non puoi chiamare un metodo della classe figlio, ma puoi fare il contrario, ovvero creare un oggetto della classe figlio e da questo chiamare i metodi della classe padre.

    Codice PHP:
    $salutami = new SalutoTabella();
    print 
    $salutami -> getSaluto("ciao Bello");
    print 
    $salutami -> salutoDentroTab("ciao Bello"); 

  3. #3
    Ciao grazie per l'aiuto.
    Ho provato il tuo suggerimento:

    Codice PHP:
    $salutami = new SalutoTabella();
    print 
    $salutami -> getSaluto("ciao Bello");
    print 
    $salutami -> salutoDentroTab("ciao Bello"); 
    ma ottengo
    Codice PHP:
    Fatal error: Class 'SalutoTabella' not found in.. 
    cioé la classe SalutoTabella non é stata trovata perché figlia di ClasseSaluto.

    Per quanto ho capito io la funzione spl_autoload_register() funziona in base al nome dato al file che contiene la classe, che deve essere identico al nome della classe stessa, e ovviamente se cerco di chiamare un figlio della classe,ed essendo che nella cartella dove sono contenute tutte le classi non esiste nessun file che si chiama in quel modo (nel mio caso SalutoTabella ) mi dà l'errore.
    Ora io non penso che chi ha sviluppato questa funzione ha pensato solo di poter utilizzare con classi che non hanno figlie, quindi penso che il tonto sono io che non capisco come fare
    <-------------------------------->
    Se non avessimo difetti, non ci farebbe tanto piacere trovarne negli altri.
    <-------------------------------->
    Andate sempre contro il vento...Solo così imparerete a volare...

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Il file con la definizine delle classi lo devi comunque includere.

  5. #5
    Be questo é ovvio, é per questo motivo che sto cercando di utilizzare

    spl_autoload_register

    Per far si di includere le classi, ma perché mi include solo i padri e non i figli?
    <-------------------------------->
    Se non avessimo difetti, non ci farebbe tanto piacere trovarne negli altri.
    <-------------------------------->
    Andate sempre contro il vento...Solo così imparerete a volare...

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Come hai detto tu, se non c'è il file chiamato come la classe, l'autoload non carica niente.
    Per questo, ogni classe dovrebbe stare nel suo file

    ClasseSaluto => classesaluto.php
    SalutoTabella => salutotabella.php

    Visto che SalutoTabella è figlia di ClasseSaluto, nel file salutotabella.php dovrai includere classesaluto.php

    Un altra alternativa, è che ti scrivi tu la funzione di autoload e trovi una nomenclatura per le classi che ti permette, partendo dal nome della classe figlia, di includere il file giusto.

    Personalmente ti suggerirei di avere 1 classe 1 file

  7. #7
    Grazie per l'interessante risposta.
    Mi hai tolto un dubbio, io pensavo che fossi io ad non riuscire a far funzionare correttamente lo script, ma visto che é cosi che funziona bisogna adattarsi.
    Personalmente seguirò il tuo consiglio e cioè quello di creare un file per ogni classe figlio ed di inserirci dentro un include (o meglio un require_once) che che mi richiama la classe padre, e sempre una soluzione che non mi piace, perché nella cartella che contiene le classi si verrà a creare un disordine che mi porta a confusione, ma questo è sempre meglio che dover fare i collegamenti uno ad uno in ogni pagina del sito.


    Grazie ancora.
    <-------------------------------->
    Se non avessimo difetti, non ci farebbe tanto piacere trovarne negli altri.
    <-------------------------------->
    Andate sempre contro il vento...Solo così imparerete a volare...

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.