2010-01-21 4 views
6

Speravo che se dovessi definire costanti in uno spazio dei nomi indipendente, come:Autoloading costanti in PHP?

namespace config\database\mysql; 

const HOST = 'localhost'; 
const USER = 'testusr'; 
const PASSWORD = 'testpwd'; 
const NAME = 'testdb'; 

Che sarei stata in grado di utilizzare __autoload ad essi includono automaticamente:

function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\HOST; 

Questo, tuttavia, non funziona. Il __autoload non è chiamato per la costante come è con le classi, lasciandomi un errore Undefined constant.

Un modo per simulare la classe __autoload per le costanti?

risposta

7

Prova questa (ha lavorato sul mio server):

<?php 
namespace config\database\mysql; 

class Mysql 
{ 
    const HOST = 'localhost'; 
    const USER = 'testusr'; 
    const PASSWORD = 'testpwd'; 
    const NAME = 'testdb'; 
} 
?> 

<?php 
function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\Mysql::HOST; 
?> 

Fondamentalmente è necessario creare una classe di agire come un wrapper per le costanti, ma in questo modo permette __autoload() per funzionare come previsto.

+0

Grazie! Questo sembra promettente. Non mi piace affatto doverli avvolgere in classi fittizie, ma sembra funzionare. – Atli

0

L'utilizzo di una costante indefinita genera un avviso PHP.

È possibile scrivere un gestore di errori personalizzato per rilevare l'avviso e caricare il file delle costanti appropriato.

+1

Questo non è quello che chiede Atli ... –

+0

Grazie per il suggerimento. Sfortunatamente l'errore 'Undefiend constant' è un errore fatale (' E_ERROR'), che un gestore personalizzato non può catturare. – Atli

+0

Hmm. Certo, era un avviso, ma non sto usando 5.3. – Mike