Compositore/PSR – Come autoload funzioni?

Come posso caricare in automatico le funzioni di supporto (al di fuori di qualsiasi classe)? Posso specificare in composer.json un qualche tipo di bootstrap file che deve essere caricato per primo?

InformationsquelleAutor mpen | 2014-06-11



3 Replies
  1. 63

    È possibile autoload file specifici modificando il tuo composer.json file come questo:

    "autoload": {
        "files": ["src/helpers.php"]
    }
    

    (grazie Kint)

    • Si noti che questo file sempre essere incluso quando si chiama il caricamento di file – questo è meglio essere veloce, o ogni script php che utilizza viene influenzata.
    • Questo è stato molto utile, grazie. Proprio come un recomendtion, controllare se la funzione esiste prima : if (!function_exists(‘myfunction’))
    • Come faccio a caricare un functions.php file che contiene solo le funzioni da un repo Git in un pacchetto? Ho accesso per modificare il pacchetto del compositore.file json.
    • Non sono sicuro di quello Git ha a che fare con esso. Non è possibile caricare le funzioni da remoto, se è quello che stai chiedendo. Basta cambiare src/helpers.php per path/to/functions.php. Se non è chiaro, si potrebbe desiderare di fare una nuova domanda.
    • Questa non è una risposta adeguata per le persone che hanno una PSR-4 autoload modello già predisposto e desidera caricare in automatico le funzioni nello stesso modo come le classi.
    • Si possono utilizzare oltre che per il PSR-4 autoload. Se non è accettabile per voi, l’unica altra opzione sono a conoscenza è quello di utilizzare metodi statici pubblici invece di materie prime funzioni. __autoload/spl_autoload_register non supporta il caricamento di funzioni.
    • Mi sono imbattuto in una situazione simile. Avendo una funzione foobar in un functions.php è possibile solo per caricare via composer, se il file è al di fuori di src E utilizza i controlli, se funzioni già presenti. Se al suo interno src, si avrà un errore, come The autoloader expected class "App\functions".... Se non si verifica se la tua funzione(s) esiste già, verrà eseguita nel Cannot redeclare ... problemi.
    • Che non ha il suono giusto. src non è speciale, e si otterrà solo un “Non è possibile dichiarare …” se si prova a caricare due volte. “atteso classe App\functions” è anche di pesce, queste non sono le classi di cui stiamo parlando.
    • Ciao @mpen, non riuscivo a trovare una buona fonte, come “autoload” file con il compositore, che contiene solo le funzioni. Non voglio utilizzare le classi per questi. La mia attuale soluzione è descritto nel mio commento precedente. C’è una buona fonte come fare “modo giusto”?
    • La mia risposta descrive esattamente come fare. Solo vendor/autoload.php da qualche parte e compositore, si prenderà cura di tutto il resto. Suona come si potrebbe avere uno spazio dei nomi (chiamato App) che sta causando problemi. Assicurarsi di utilizzare il completo nome della funzione se si utilizza uno.

  2. 2

    Dopo alcune prove, ho venuto a conclusioni che l’aggiunta di uno spazio dei nomi di un file che contiene le funzioni e l’impostazione del compositore di autoload questo file sembra non caricare questa funzione su tutti i file che richiedono il caricamento di percorso.

    Per sintetizzare, questo autoload la funzione ovunque:

    compositore.json

    "autoload": {
        "files": [
            "src/greetings.php"
        ]
    }
    

    src/greetings.php

    <?php
        if( ! function_exists('greetings') ) {
            function greetings(string $firstname): string {
                return "Howdy $firstname!";
            }
        }
    ?>
    

    Ma questo non caricare la propria funzione, ogni richiesta di autoload:

    compositore.json

    "autoload": {
        "files": [
            "src/greetings.php"
        ]
    }
    

    src/greetings.php

    <?php
        namespace You;
    
        if( ! function_exists('greetings') ) {
            function greetings(string $firstname): string {
                return "Howdy $firstname!";
            }
        }
    ?>
    

    E si dovrebbe chiamare la funzione utilizzando use function ...; come segue:

    example/example-1.php

    <?php
        require( __DIR__ . '/../vendor/autoload.php' );
    
        use function You\greetings;
    
        greetings('Mark'); //"Howdy Mark!"
    ?>
    
    • Che è perché la sua condizione non è corretto – si consiglia di utilizzare FQN per function_exists(): if(!function_exists('You\greetings')). Non ha nulla a che fare con autloading.
  3. -3
    1. Aggiungere autoload info in composer.json
    {
        "autoload": {
            "psr-4": {
                "Vendor\\Namespace\\": "src/"
            }
        }
    }
    
    1. Creare un OwnFunctions.php con le funzioni in src/Functions cartella
    //recommend
    //http://php.net/manual/en/control-structures.declare.php
    declare(strict_types=1);
    
    namespace Vendor\Namespace\Functions\OwnFunctions;
    
    function magic(int $number): string {
        return strval($number);
    }
    1. Nel index.php richiedono compositore autoload
    declare(strict_types=1);
    require_once __DIR__ . '/vendor/autoload.php';
    
    use function Vendor\Namespace\Functions\OwnFunctions\magic;
    
    echo magic(1);
    
    //or you can use only OwnFunctions namespace
    use Vendor\Namespace\Functions\OwnFunctions;
    
    echo OwnFunctions\magic(1);

    Anche questo può essere fatto con const

    use const Vendor\Namespace\Functions\OwnFunctions\someConst;
    echo someConst;

    Documentazione ufficiale

    • Questo non autoload nulla – funzioni non possono essere caricate in PHP, l’autocaricamento funziona solo per le classi.
    • Hai ragione. Questo funziona solo se inclusi i file manualmente, o più spazi dei nomi nello stesso file.

Lascia un commento