Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    caricamento dinamico classi

    Ciao, ho un problema

    Sto rifacendo un vecchio sito bilingue, e sto avendo dei problemi col richiamo delle classi da... una classe.

    Allora prima di tutto la struttura del sito:
    codice:
     ROOT --> BIN --> CLASSES
    |           |  --> INTERFACES
    |           |  --> INCLUDES
    IT  --> index.php // sito in italiano
    EN --> index.php // sito in inglese
    autoloader.php
    index.php
    Nulla di speciale, ho ovviamente esluso file e directory di supporto, come: immagini, css e javascript che per ora non servono alla domanda.

    Quindi: autoloader.php è richiamato da ogni file PHP, sia che si trovi nella ROOT del sito, o che si trovi in EN o IT e come dice il nome, carica dinamicamente le classi che si trovano nella directory CLASSES dentro la directory generale BIN.
    Il tutto funziona bene, ma quando tento di richiamare una classe dall'interno della stessa classe, il sistema mi dice errore: classe non trovata!

    Bene un po' di codice: autoloader.php
    Codice PHP:
    class Autoloader
    {
        public static function 
    loaderClasses$className ) {
            
    $path '';  //  Se si è nella root il path è blank.
            //  Se ci si trova in una delle due directory IT o EN il path deve tornare indietro di uno step.
            //  REAL_PATH è una costante creata in un file di configurazione che viene caricato prima di autoloader.php e contiene il path del file chiamante autoloader.php 
            
    if ((preg_match('/\bit/i'REAL_PATH) > ) || (preg_match('/\ben/i'REAL_PATH) > )) $path '/..';
            
    $classe REAL_PATH $path '/bin/class/' str_replace('\/_\\'DIRECTORY_SEPARATORstrtolower$className ) ) . '.class.php';
            if ( 
    file_exists$classe ) && is_readable$classe ) )
                require ( 
    $classe );
        }
        
        public static function 
    loaderInterfaces$interfacesName ) {
            
    $path '';
            if ((
    preg_match('/\bit/i'REAL_PATH) > ) || (preg_match('/\ben/i'REAL_PATH) > )) $path '/..';
            
    $interfaccia REAL_PATH $path '/bin/interface/' str_replace('\/_\\'DIRECTORY_SEPARATORstrtolower$interfacesName ) ) . '.int.php';
            if ( 
    file_exists$interfaccia ) && is_readable$interfaccia ) )
                require ( 
    $interfaccia );
        }
    }

    spl_autoload_extensions('.class.php, .int.php');

    spl_autoload_register__NAMESPACE__ '\\Autoloader::loaderClasses' );
    spl_autoload_register__NAMESPACE__ '\\Autoloader::loaderInterfaces' ); 
    Quindi se lo richiamo da un file php sia da ROOT che da una delle due directory di lingua e poi carico una classe, questa viene caricata senza problemi.

    Per esempio
    Codice PHP:
    //  prova.php
    include 'autoloader.php';
    $v= new Ciccio();  //  Ciccio esiste 
    Ma se creando la classe ciccio, che ripeto si trova in ROOT-->BIN-->CLASSES e da questa voglio richiamare la classe paperino, quest'ultima non viene trovata.

    Esempio: file paperino.class.php
    Codice PHP:
    //  Classe paperino
    class Paperino {
      function 
    chiSono() {
        return 
    'Ciao sono Paperino';
      }

    file: ciccio.class.php -- primo esempio
    Codice PHP:
    class Ciccio {
      function 
    __construct() {
        echo 
    Paperino::chiSono();  //  Non trova la classe.

    file: ciccio.class.php -- secondo esempio
    Codice PHP:
    class Ciccio exteds Paperino {
      function 
    __construct() {
        echo 
    parent::chiSono();  //  Non trova la classe.

    In altre parole anche se autoloader.php carica le classi regolarmente, se dopo aver caricata una classe dal file che lo chiama, questa non trova una classe ausiliaria.
    Come posso risolvere?
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    191
    1) Abilità il registro degli errori php nel tuo webserver.
    2) Usa error_reporting(-1); solo sul primo script php
    Credo non riesce a trovare perché include_path ha un percorso strano in realtà se la root fisica è del tipo /home/user/public_html/ (con echo dirname(__FILE__); sul file index.php nella cartella principale del sito ti mostra /home/user/public_html/) è questa la vera root quindi in uno script php /home/user/public_html/file.php e non solamente file.php https://www.php.net/manual/en/function.include.php
    Ultima modifica di darbula; 08-12-2020 a 11:56

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    @darbula, lo so che è per quello che non lo trova, figurati sul server di produzione che sto usando è installato xdebug, il problema non è leggere l'errore.
    Comunque l'ho risolto, avevo scritto una put...ata in pratica invece che scrivere Connetti::getPDO() avevo scritto Connetti()::getPDO().
    Era un errore di sintassi, ma al solito i messaggi di errore sono sibillini, mi diceva che non trovava la classe, mentre invece era un errore di sintassi, certo così la classe non la trovava, ma non è il giusto motivo dell'errore.
    Tolte le tonde ha funzonato, cvd.

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.