Visualizzazione risultati 1 fino 4 di 4

Discussione: Creare funzione autoloader

  1. #1
    cyberlab non è connesso Neofita
    Data registrazione
    03-12-2014
    Messaggi
    5

    Predefinito Creare funzione autoloader

    Salve a tutti,
    sul mio sito ho una funzione di autoloader delle classi che viene eseguita dalla classica funzione __autoload(),
    leggendo in giro su internet ho visto che questa funzione è segnata come "Deprecata" nelle versioni di php 7.2 e in sua sostituzione si dovrebbe usare la sua sostituta spl_autoload_register().

    ho il seguente file init.php in cui è scritta la funzione __autoload()
    Codice PHP:
    <?php
    // FILE: init.php
    require_once ROOT . DS . 'config' . DS . 'config.php';

    function
    __autoload ( $class_name )
    {
    $lib_path = ROOT . DS . 'lib' . DS . strtolower( $class_name ) . '.class.php';
    $controllers_path = ROOT . DS . 'controllers' . DS . str_replace( 'controller', '', strtolower( $class_name ) ) . '.controller.php';
    $model_path = ROOT . DS . 'models' . DS . strtolower( $class_name ) . '.php';

    if (
    file_exists( $lib_path ) )
    require_once
    $lib_path;
    elseif (
    file_exists( $controllers_path ) )
    require_once
    $controllers_path;
    elseif (
    file_exists( $model_path ) )
    require_once
    $model_path;
    else
    {
    throw new
    Exception( 'Failed to include class: ' . $class_name );
    }
    }
    non dovrebbe diventare nel seguente modo per poter usare il metodo spl_autoload_register()?

    Codice PHP:
    <?php
    // FILE: init.php
    require_once ROOT . DS . 'config' . DS . 'config.php';

    function
    MyAutoloader ( $class_name )
    {
    $lib_path = ROOT . DS . 'lib' . DS . strtolower( $class_name ) . '.class.php';
    $controllers_path = ROOT . DS . 'controllers' . DS . str_replace( 'controller', '', strtolower( $class_name ) ) . '.controller.php';
    $model_path = ROOT . DS . 'models' . DS . strtolower( $class_name ) . '.php';

    if (
    file_exists( $lib_path ) )
    require_once
    $lib_path;
    elseif (
    file_exists( $controllers_path ) )
    require_once
    $controllers_path;
    elseif (
    file_exists( $model_path ) )
    require_once
    $model_path;
    else
    {
    throw new
    Exception( 'Failed to include class: ' . $class_name );
    }
    }

    spl_autoload_register('MyAutoloader');
    Così facendo le mie classi non si autocaricano e di conseguenza ricevo errori di classi non trovate.
    Sostanzialmente i cambiamenti dovrebbero essere il nome della funzione di autoloader in 'MyAutoloader'
    e l'aggiunta del metodo spl_autoload_register('MyAutoloader')

    non riesco a capire perchè non funziona, potete aiutarmi gentilmente?
    Vi ringrazio in anticipo!

    Edit:
    Scusate, ho trovato il problema. Lascio la soluzione nel caso qualcuno ne avesse bisogno. L'errore era nell'eseguire l'istruzione require_once ROOT . DS . 'config' . DS . 'config.php';
    prima dell' spl_autoload_register('MyAutoloader'); è bastato portarlo in testa al documento e tutto funziona correttamente.

    Prima della correzione.
    Codice PHP:
    <?php
    // FILE: init.php
    require_once ROOT . DS . 'config' . DS . 'config.php';

    function
    MyAutoloader ( $class_name )
    {
    // ... resto del codice php ...//
    Dopo la correzione.
    Codice PHP:
    <?php
    // FILE: init.php
    spl_autoload_register('MyAutoloader');

    require_once
    ROOT . DS . 'config' . DS . 'config.php';

    function
    MyAutoloader ( $class_name )
    {
    // ... resto del codice php ...//
    Ultima modifica di cyberlab : 07-06-2017 alle ore 16.29.10

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Bene per la soluzione!
    Unico appunto: normalmente non c'è nessuna controindicazione ad eseguire un include, require o simili prima di registrare un autoloader. Se in questo caso sono emersi problemi, è probabile che ci sia qualche conflitto con il file config.php.

  3. #3
    cyberlab non è connesso Neofita
    Data registrazione
    03-12-2014
    Messaggi
    5

    Predefinito

    Ciao grazie della precisazione, a dire il vero nel file config.php vengono usati dei metodi statici di una classe che mi sono creato.
    Presumo sia questo il motivo del problema cioè se tento di richiamarli tramite il require config.php, prima di aver dichiarato il spl_autoload_register(), l'autoloader non sà dove sbattere il naso o almeno è quello che ho capito dalle prove che ho eseguito.
    Sono un autodidatta, per cui, correggimi pure se stò sbagliando :)

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Sì, stando così le cose probabilmente hai visto giusto !

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •