Come dovrei progettare un autoloader di classe PHP?

4

Ho una struttura di cartelle abbastanza semplice in cui le classi principali si trovano in una cartella e tutte le classi utilizzate da quelle classi si trovano in una sottocartella con lo stesso nome di quella classe.

/exampleClass.php
/exampleClass/usedByExampleClass.php

Sto cercando di creare un semplice caricatore automatico per questa convenzione di denominazione.

Finora, la mia idea è di usare caratteri di sottolineatura nel nome della classe ovunque ci sia una barra in avanti nel percorso della classe. In questo modo posso semplicemente sostituire tutti i caratteri di sottolineatura con barre in avanti nel caricatore automatico e caricare il file di classe.

Questo significa che il nome della classe è stato trovato nel file:

/exampleClass/usedByExampleClass.php

sarebbe:

exampleClass_usedByExampleClass

Questi nomi di classe finiscono per essere molto lunghi comunque, e vorrei accorciarli pur avendo un semplice caricatore automatico per questa struttura di cartelle.

Qualche idea o idea su come ottenere sia nomi di classi brevi sia un semplice caricatore automatico per questa struttura di cartelle?

    
posta dqhendricks 13.04.2011 - 20:17
fonte

4 risposte

7

How should I design a PHP class autoloader?

Non dovresti.

I lead di una serie di framework PHP (Zend Framework, CakePHP, ecc.) e applicazioni (Joomla, phpBB, ecc.) si sono riuniti alla fine del 2009 per costruire PSR-0 Autoloader Proposal , che detta uno schema di denominazione dei file di classe e un meccanismo di namespace.

È notevolmente simile al tuo sistema esistente, con la semplice inclusione di spazi dei nomi PHP 5.3.

È semplice, è semplice, e se tutto andrà bene, in futuro funzionerà solo con un gran numero di codice di terze parti.

    
risposta data 14.04.2011 - 09:46
fonte
2

Se la tua versione di PHP lo supporta, usa namespace.

namespace Session;

class Driver {

     // etc...

}

Nel caricatore automatico ...

if (file_exists($path = str_replace('\', '/', strtolower($class)))
{
     require $path;
}
    
risposta data 14.04.2011 - 02:57
fonte
1

Dal momento che nessuno lo ha menzionato, ma ora un compositore di giorni è la cosa chiave da fare per il caricamento automatico in PHP.

  1. È un sistema di piccole dimensioni ampiamente utilizzato per il caricamento automatico delle classi presenti in qualsiasi struttura. Con l'aiuto di composer.json puoi personalizzare in modo efficace la struttura della tua directory e caricare automaticamente il file autloader creato
  2. Puoi quindi scaricare i file lib di github noti che si collegano facilmente ai tuoi progetti
  3. Poiché è una buona pratica, non reinventare la ruota.
I tutorial

(come l'uomo del compositore potrebbe essere un po 'magro) possono essere trovati in luoghi come link

    
risposta data 17.03.2014 - 13:01
fonte
0

Se puoi utilizzare i nomi che puoi utilizzare. Il tuo autoloader dovrebbe essere in grado di registrarli e usa un "prefisso" per trovarli. Quindi puoi renderlo possibile:

Il lettore di classi nel namespace Application \ Core \ Database \ Table potrebbe avere un prefisso di DBTable. Quindi il nome della classe è DBTable_Reader, che risiede nello spazio dei nomi Application \ Core \ Database \ Table.

Ciò impedisce i nomi lunghi, ma perde parte della chiarezza. Se dai un'occhiata al caricatore automatico di Symfony o di Zend Framwork riceverai molta ispirazione.

    
risposta data 14.04.2011 - 07:15
fonte

Leggi altre domande sui tag