Domanda

Quale soluzione consiglieresti di includere file in un progetto PHP?

  1. Non ci sono chiamate manuali per le funzioni di richiesta / inclusione: tutto viene caricato tramite le funzioni di caricamento automatico
  2. Importazione di pacchetti, quando necessario.

Ecco l'API di importazione del pacchetto:

import('util.html.HTMLParser');
import('template.arras.*'); 

In questa dichiarazione di funzione è possibile esplodere la stringa con punti (delimitatore della gerarchia del pacchetto), scorrere i file in un determinato pacchetto (cartella) per includerne solo uno o tutti se il simbolo dell'asterisco si trova alla fine del stringa, ad es ( 'Template.arras. *').

Uno dei vantaggi che posso vedere nel metodo di importazione dei pacchetti è che può costringerti a utilizzare una migliore scomposizione degli oggetti e un raggruppamento di classi.

Uno degli svantaggi che posso vedere nel metodo di caricamento automatico - è che la funzione di caricamento automatico può diventare molto grande e non molto ovvia / leggibile.

Cosa ne pensi?

  • Quali vantaggi / svantaggi puoi nominare in ciascuno di questi metodi?
  • Come posso trovare la migliore soluzione per il progetto?
  • Come posso sapere se ci saranno problemi di prestazioni se si utilizza la gestione dei pacchetti?
È stato utile?

Soluzione

Uso ampiamente __autoload (). La funzione di caricamento automatico che utilizziamo nella nostra applicazione ha alcune modifiche per la compatibilità con le versioni precedenti delle classi precedenti, ma generalmente seguiamo una convenzione quando creiamo nuove classi che consentono a autoload () di funzionare in modo abbastanza apparente:

  • Denominazione di classe coerente : ogni classe nel proprio file, ogni classe è denominata con custodia di cammello separata da un carattere di sottolineatura. Questo è associato al percorso di classe. Ad esempio, Some_CoolClass esegue il mapping alla nostra directory di classe, quindi "Some / CoolClass.class.php". Penso che alcuni framework utilizzino questa convenzione.
  • Richiedi esplicitamente classi esterne : poiché non abbiamo il controllo sulla denominazione di alcuna libreria esterna che utilizziamo, le cariciamo utilizzando la funzione request_once () di PHP.

Altri suggerimenti

Il metodo di importazione è un miglioramento ma carica ancora più del necessario.
O usando l'asterisco o caricandoli all'inizio dello script (perché l'importazione prima di ogni "nuovo nome di classe" diventerà scomoda)

Sono un fan di __autoload () o meglio spl_autoload_register ()
Perché includerà solo le classi che stai utilizzando e il vantaggio extra di non preoccuparti della posizione della classe. Se i tuoi college spostano un file in un'altra directory non sei effettuato.

Il rovescio della medaglia è che ha bisogno di logica aggiuntiva per farlo funzionare correttamente con le directory.

Uso require_once (" ../ path-to-auto-load-script.php.inc ") con caricamento automatico

Ho una convenzione di denominazione standard per tutte le classi e i file inc che semplifica la determinazione programmatica del nome della classe attualmente richiesto.

per esempio, tutte le classi hanno una certa estensione come inc.php
(quindi so che saranno nella directory / cls)
e
tutti i file inc iniziano con .ht (quindi saranno nella directory / inc)

il caricamento automatico accetta un parametro: className, che utilizzo quindi per determinare dove si trova effettivamente il file. ciclica una volta che so qual è la mia directory di destinazione, ogni volta aggiungendo " ../" per tenere conto delle sottopagine secondarie (che sembravano interrompere il caricamento automatico per me) e infine richiedere_una volta trovato il file di codice effettivo una volta trovato.

Suggerisco vivamente di fare quanto segue invece:

Lancia tutte le tue classi in un array statico, className = > filepath / file di classe. La funzione di caricamento automatico può usarlo per caricare le classi.

Questo assicura che carichi sempre la quantità minima di file. Ciò significa anche che si evitano nomi di classe completamente stupidi e l'analisi di tali nomi.

Se è lento, puoi mettere un po 'di acceleratore e questo ti farà guadagnare molto di più, se è ancora lento, puoi eseguire le cose attraverso un processo di' compilazione ', in cui i file usati spesso vengono semplicemente scaricati in comune file e i riferimenti di caricamento automatico possono essere aggiornati per puntare alla posizione corretta.

Se inizi a riscontrare problemi in cui il caricamento automatico è troppo lento, cosa che trovo difficile da credere, puoi dividerlo in base ai pacchetti e avere più funzioni di caricamento automatico, in questo modo sono necessari solo sottoinsiemi di array, questo funziona meglio se i tuoi pacchetti sono definiti attorno a moduli del tuo software (login, admin, email, ...)

Non sono un fan di __autoload () . In molte librerie (alcune librerie PEAR, ad esempio), gli sviluppatori usano class_exists () senza passare il secondo parametro relativamente nuovo. Qualsiasi codice legacy che hai potrebbe anche avere questo problema. Ciò può causare avvisi ed errori se è stato definito un __autoload () .

Se le tue librerie sono chiare e non hai un codice legacy da gestire, è uno strumento fantastico. A volte vorrei che PHP fosse stato un po 'più intelligente su come gestivano il comportamento di class_exists () , perché penso che il problema riguardi quella funzionalità piuttosto che __autoload () .

Avere un sistema di confezionamento personalizzato è probabilmente una cattiva idea. Suggerirei di utilizzare le inclusioni manuali esplicite o il caricamento automatico (o una combinazione del genere).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top