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

    spl_autoload_register non mi trova le classi

    Ciao
    come da titolo, ma non è seplice come sembra; in realtà il problema non è dovuto ad un nome o ad un percorso sbagliato. No è peggio

    In pratica ho creato per prova la seguente WEBDIRECTORY

    ROOT --> classes
    ....................A
    ....................B
    ....................C

    Dove appunto in root c'è una directory che contiene altre directory, chiamate A, B, C.
    Ognuna di queste contiene le classi, mentre in ROOT ci sono l'index.php che richiama le varie classi a seconda dell'uso; e il file autoload.inc.php che contiene le funzioni di autoload.
    Un po' di codice:

    autoload.php
    Codice PHP:
    class Autoloader
    {
        public static function 
    classLoaderA$className )
        {
            
    $file __DIR__ '/classes/A/' str_replace'//'DIRECTORY_SEPARATOR$className ) . '.class.php';
            if ( 
    file_exists$file ) && is_readable$file ) )
            {
                require( 
    $file );
                return;
            }
            else
            {
                throw new 
    Exceptionsprintf'(Livello A)Ho cercato di caricare %1$s che si trova nel file %2$s'$className$file ) );
            }
        }
        
        public static function 
    classLoaderB$className )
        {
            
    $file __DIR__ '/classes/B/' str_replace'//'DIRECTORY_SEPARATOR$className ) . '.class.php';
            if ( 
    file_exists$file ) && is_readable$file ) )
            {
                require( 
    $file );
                return;
            }
            else
            {
                throw new 
    Exceptionsprintf'(Livello B)Ho cercato di caricare %1$s che si trova nel file %2$s'$className$file ) );
            }
        }
        
        public static function 
    classLoaderC$className )
        {
            
    $file __DIR__ '/classes/C/' str_replace'//'DIRECTORY_SEPARATOR$className ) . '.class.php';
            if ( 
    file_exists$file ) && is_readable$file ) )
            {
                require( 
    $file );
                return;
            }
            else
            {
                throw new 
    Exceptionsprintf'(Livello C) Ho cercato di caricare %1$s che si trova nel file %2$s'$className$file ) );
            }
        }
    }

    spl_autoload_register'Autoloader::classLoaderA' );
    spl_autoload_register'Autoloader::classLoaderB' );
    spl_autoload_register'Autoloader::classLoaderC' ); 
    mentre index.php

    Codice PHP:
        include_once( __DIR__ '/autoload.inc.php' );
        
    var_dumpspl_autoload_functions() );

        
    //  Carico le classi

        
    $objA = new a' Sono A' );
        
    $objAA = new aa'Sono AA' );

        
    $objB = new b'Sono B' );
        
    $objC = new c'Sono B' );


        unset( 
    $objA$objAA$objB$objC ); 
    le varie classi sono tutte uguali, variando solo la posizione all'interno delle directory e nel nome del file e della classe.

    A titolo d'esempio, ecco la a.class.php

    Codice PHP:
    class a
    {
        function 
    __constructString $stringa )
        {
            echo 
    $stringa;
        }

    in tutto 4 file chiamati a.class.php, aa.class.php, b.class.php, c.class.php che si trovano rispettivamente nelle directory A, B, C.

    Ebbene, quando richiamo index.php dal browser, ottengo questo>
    C:\xampp\htdocs\siti\classi\index.php:25:
    array (size=3)
    0 =>
    array (size=2)
    0 => string 'Autoloader' (length=10)
    1 => string 'classLoaderA' (length=12)
    1 =>
    array (size=2)
    0 => string 'Autoloader' (length=10)
    1 => string 'classLoaderB' (length=12)
    2 =>
    array (size=2)
    0 => string 'Autoloader' (length=10)
    1 => string 'classLoaderC' (length=12)

    Sono A Sono AA

    ( ! ) Fatal error: Uncaught Exception: (Livello A) Ho cercato di caricare b che si trova nel file C:\xampp\htdocs\siti\classi/classes/A/b.class.php in C:\xampp\htdocs\siti\classi\autoload.inc.php on line 15
    ( ! ) Exception: Ho cercato di caricare b che si trova nel file C:\xampp\htdocs\siti\classi/classes/A/b.class.php in C:\xampp\htdocs\siti\classi\autoload.inc.php on line 15
    Call Stack
    # Time Memory Function Location
    1 0.0022 404800 {main}( ) ...\index.php:0
    2 0.0146 416416 spl_autoload_call ( ) ...\index.php:33
    3 0.0146 416416 Autoloader::classLoaderA( ) ...\index.php:33
    Per chiarire subito la riga 33 di index.php è questa: $objB = new b( 'Sono B' ); mentre la 15 di autoload.inc.php è la chiamata all'eccezione di livello A.

    Nella prima parte richiamo var_dump( spl_autoload_functions() ); vedere cosa fanno i tre richiami ad spl_autoload_register(); e vedo che l'array tornato contiene tutte e tre le chiamate.
    E quando richiamo le classi A e AA tutto funziona perfettamente, ma quando richiamo la classe B mi va in errore.
    Io non so perché fa questo, in un progetto reale che sto sviluppando in ufficio, questo non succede, ma riportando lo stesso progetto sul mio pc di casa si presente questo stesso problema.
    L'esempio che ho riportato qui, è per studiare il caso, ma non comprendo cosa lo provoca. L'autoload è lo stesso!

    I sistemi operativi e server sono diversi, è l'unica cosa che per ora mi spiega il problema, ma la vedo un po' tirata, anche se non impossibile.
    Qui a casa Windows 10 con l'ultimo upgrade, Sistema XAMP con PHP 7.4
    In ufficio Windows 7 con Apache ultima versione e PHP 7.4

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,555
    Premetto che di autoloading con funzioni multiple non ho molta esperienza (se usi i namespaces ti basta una sola funzione).

    Cmq quando registri le funzioni php crea una coda. Quindi proverà la prima funzione e se non riesce a caricare la classe passerà alla seconda e così via.
    Se lanci l'eccezione in ogni funzione "rompi" questa coda. Quindi quando provi a caricare la classe b, la prima funzione (classLoaderA) lancia l'eccezione (ovviamente non trova il file) e l'autoloading si ferma.

    Quindi, togli le eccezioni o al massimo mettila nell'ultima funzione che registri

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,573
    No guarda che le eccezioni ce le ho messe dopo per comprendere dove è l'errore e non l'ho ancora capito.
    Oggi sono sul programma reale e mi si è presentato sul server di produzione ( chiamiamolo così ) aggiungendo una nuova directory con un nuovo sistema di classi.
    E il sistema mi trova tutto, tranne che nell'ultima, quella aggiunta poco fa.
    E non hanno nessuna eccezione.

    In pratica sostituisci ad A, B e C; Searching e CRUD che stanno dentro la class/
    In class ci sono file generici, mentre in Search le classi che rispondono ad una ricerca nel database ( e funzionano ), mentre in CRUD ( dovrebbe ) ci stanno le classi che generano i vari salvataggi, eccetera.
    Per ora in CRUD ci ho messo solo il file CRUD.class.php con dentro una classe chiamata CRUD, tanto per provare.

    Chiamata da un file di prova, non la trova, mentre una ricerchina me la fa, la tabella con i primi 25 record me li trova, quindi non so che pensare.

    Ecco la risposta del server relativa alle ricerche, riporto ciò che una semplice istruzione in ogni metodo mi riporta:
    GENERIC Path: C:\Apache\users\marco\TEL/bin/class/searching.class.php
    GENERIC Path: C:\Apache\users\marco\TEL/bin/class/Connetti.class.php
    SEARCH Path: C:\Apache\users\marco\TEL/bin/class/Search/searching.class.php
    GENERIC Path: C:\Apache\users\marco\TEL/bin/class/CRUD.class.php
    SEARCH Path: C:\Apache\users\marco\TEL/bin/class/Search/CRUD.class.php
    CRUD Path: C:\Apache\users\marco\TEL/bin/class/CRUD/CRUD.class.php
    In pratica ad ogni richiesta il sistema si va a cercare il file interessato.
    GENERIC appartiene alla directory class
    SEARCH alla directory Search
    CRUD alla directory CRUD

    il file CRUD.class.php dentro CRUD/ ovviamente esiste e contiene la classe:
    Codice PHP:
    class CRUD implements Connetti
    {
       private 
    $pdo null;
        
        function 
    __construct()
        {
            
    $this->pdo parent::__construct();
        }
        function 
    __destruct()
        {
            unset( 
    $this->pdo );
        }
        

    Connetti è una classe che connette al database e si trova in connetti.class.php che sta in class/ che viene usata anche da search e che trova benissimo
    Ultima modifica di Marcolino's; 11-05-2020 a 09:26

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,573
    E niente, devo andare a Castelmonte https://www.santuariocastelmonte.it/ e farmi benedire.
    E' la seconda volta che faccio casino, e non è nelle mie corde fare questo tipo di errori, ma tantè...

    Quindi non mi trovava la classe CRUD semplicemente perché sul server c'erano due directory CRUD identiche e quindi mi andava in confusione, poverino
    Tolta una è partito così come doveva partire.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.