Un framework che sto scrivendo (per l'apprendimento) richiede una versione PHP specifica per l'esecuzione, quindi sto implementando un "controllo versione PHP" per garantire che la versione in PHP sia il minimo richiesto per il quadro.
Impostazione di base
htaccess reindirizza tutto a index.php (front controller);
index.php carica bootstrap.php (nient'altro);
bootstrap.php carica i componenti principali (impostazione di visualizzazione degli errori, registrazione degli errori, impostazioni dell'utente, quindi instrada l'URI richiesto);
Problema
Se la versione controllo codice o qualsiasi cosa caricata prima richiede una versione PHP superiore a quella in esecuzione, il controllo stesso e qualsiasi cosa prima fallirà.
Opzione grezza
Il caricamento del codice di controllo della versione prima funzionerebbe, ma il framework ha una struttura logica, con classi in luoghi specifici chiamati come necessario con SPL e DI. E per farlo funzionare dovrebbe essere un condizionale di base in index.php (front controller), ma sto cercando di evitarlo perché:
- index.php non è un posto per tale codice
- Non avrà accesso ad altre funzionalità del framework e output non sarebbe attraverso il modello di struttura ma un messaggio non elaborato: %codice%
- La versione richiesta di PHP (ad esempio "50400") è "config" e
dovrebbe vivere in
exit('invalid PHP version');
. Aggiornamento / gestione del richiesto la versione non è l'ideale in index.php
Inoltre, il codice di controllo della versione ha un requisito di versione PHP.
per esempio. Il controllo utilizza core/config/
per ottenere la versione PHP corrente in esecuzione, che richiede PHP 5.2.7.
Potrei usare un altro metodo, ma in realtà poi sto accumulando tutti i tipi di codice in index.php, e non dovrebbe essere così.
Quindi il codice che viene prima caricato in index.php ed essendo un condizionale mi fa rabbrividire, come dovrebbe essere una bella classe che chiama Core config (etc) e non appartiene come questo in front controller come condizionale a basso costo.
Ma forse non ho scelta.
Ad esempio, il primo codice in index.php (quindi il primo codice da eseguire prima di ogni altra cosa):
if (!defined('PHP_VERSION_ID') || (PHP_VERSION_ID < 50400)) {
exit ('Insufficient PHP Version');
}
Non riesco davvero a vederlo in questo modo, dato che con le classi (ecc.) il framework ha bisogno di una certa versione di PHP per arrivare anche a una classe per controllare la versione, e se la versione è troppo bassa avrà un errore e anche la classe di controllo della versione non verrà eseguita.
È il problema del "pollo e dell'uovo".
Domanda
Sto cercando una soluzione su come risolvere questo problema, in termini di una migliore architettura software e approccio alla progettazione.
Oppure, sono bloccato come penso di essere perché la funzionalità viene eseguita prima che il controllo della versione significhi un potenziale errore dell'applicazione?
O ..
Sto cercando di risolvere qualcosa che non ha bisogno di essere risolto?
E invece basta solo dichiarare "Questo framework ha bisogno di PHP v X.X.X, l'esecuzione su una versione più bassa porterà problemi".