È l'impostazione includere percorso e autoloading due cose diverse?
-
08-10-2019 - |
Domanda
sto notando che l'aggiunta del percorso di una cartella di necessità che comprendono non è sufficiente per accedere alle classi.
Ho un'applicazione cartella / test / che contiene application / test / Test.php
class Test.php prende il nome di test senza prefissi
class Test {
}
Se aggiungo i test cartella solo nel percorso includono
realpath(APPLICATION_PATH . '/tests')
La classe Test.php non funziona nei controllori
new Test()
in modo da non sta comprendendo la cartella nella includere abbastanza percorso?
Soluzione
@StasM ha ragione. Ma ecco una piccola spiegazione di più.
Il include_path
dice a PHP dove guardare quando si esegue una include
, un include_once
, un require
, o un require_once
. Naturalmente, queste include
s e require
s riferimento sempre un particolare file .
L'auto-caricamento è specifico di perdere classi . Quando una classe non ancora scaricata viene fatto riferimento nel codice - in genere, anche se non esclusivamente, invocando l'operatore new
, come nel tuo esempio - allora autoloading è un processo che può calciare con un algoritmo per il caricamento della classe. Questo processo comporta generalmente a partire dal nome della classe mancante e la produzione di una collezione di possibili percorsi - sia in assoluto nel filesystem o relativa alle voci del include_path
- dal nome della classe mancante e quindi fare eseguire una include
nella speranza che la definizione di classe risiede in uno di essi.
Nel tuo caso, hai chiamato per una classe denominata "Test". Il file che contiene questa classe risiede nel file APPLICATION_PATH . 'tests/Test.php'
. E che ha riposto la APPLICATION_PATH . 'tests'
directory nel include_path
. Ma finché non ci sarà un algoritmo caricamento a posto, non c'è alcun modo per il sistema per collegare il nome della classe 'Test'
al nome del file 'Test.php'
.
Il PEAR in stile nome della classe convenzione fornirebbe questa connessione. E un autoloader che impiega tale convenzione - come il caricatore automatico Zend Framework predefinito -. Sarebbe in grado di svolgere tale mappatura da nome della classe per il nome del file, e quindi include
il file richiesto
Come una complicazione finale, i convenzionali Zend Framework luoghi layout di directory convention alcune classi in cartelle che sono non sul percorso sono: modelli, le forme, i servizi, i controllori, vista aiutanti, aiutanti d'azione, ecc . Ecco perché ti capiterà spesso di vedere più la configurazione del caricatore automatico - in genere nella classe Bootstrap
- la definizione di una mappatura tra certi classnames e certi luoghi nel filesystem che sono off il include_path
.
Ad esempio, una classe denominata 'Default_Model_User' potrebbe - a prima vista - essere previsto per risiedere sul include_path
in un file 'Default/Model/User.php'
. Ma la struttura di directory app di serie vuole mettere quel file in 'application / modelli / User.php'. Si noti il ??plurale 'modelli' e il minuscolo 'm' nel nome del percorso, così come la presenza di "default" nel nome di classe. config Extra il caricatore automatico è necessario al fine di dare un senso a ciò, il fornire un modello per la mappatura nome di classe-a-nome del file. Questo è di solito realizzato con un risorsa autoloader .
La speranza di tutto questo aiuta, o si o qualcun altro. Cheers!
Altri suggerimenti
include il percorso di spettacoli in cui PHP cercherei script che è in procinto di includere - in modo che quando si dice motore PHP include('blah.php')
avrebbe cercato blah.php
in tutti i percorsi nel percorso includono.
Autoloading è la funzionalità che consente certa funzione da chiamare quando PHP rileva che classe è necessaria ma non definito. In questa funzione, è possibile utilizzare il percorso di inclusione per trovare il file che contiene la classe e caricarlo, ma queste sono cose assolutamente diverse.
realpath()
non è correlato a una di queste ed è una funzione che restituisce percorso filesystem unica di un dato file, con le cose come ..
e collegamenti simbolici risolti.