2010-01-21 10 views
6

miałem nadzieję, że jeśli miałbym zdefiniować stałe w osobnej przestrzeni nazw, jak:Automatyczne ładowanie stałych w PHP?

namespace config\database\mysql; 

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

że będę mógł korzystać __autoload Aby automatycznie włączyć je:

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; 

to jednak nie działa. __autoload nie jest wywoływana dla stałej, tak jak jest z klasami, pozostawiając mnie z błędem Undefined constant.

Jakiś sposób, w jaki mogę symulować klasę __autoload dla stałych?

Odpowiedz

7

Spróbuj tego (pracował na moim serwerze):

<?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; 
?> 

Zasadniczo trzeba utworzyć klasy do działania jako otoczka do stałych, ale przez to pozwala __autoload() do pracy od zamierzonych.

+0

Dzięki! To wygląda obiecująco. Nie mam zamiaru owijać ich w klasy manekinów, ale wygląda na to, że działa. – Atli

0

Użycie niezdefiniowanej stałej spowoduje wygenerowanie ostrzeżenia PHP.

Możesz napisać niestandardową procedurę obsługi błędów, aby uchwycić ostrzeżenie i wczytać odpowiedni plik stałych.

+1

Nie o to pyta Atli ... –

+0

Dzięki za sugestię. Niestety błąd "Undefiend constant" jest błędem krytycznym ('E_ERROR'), którego niestandardowy handler nie może przechwycić. – Atli

+0

Hmm. Pewnie, że to było powiadomienie, ale nie używam 5.3. – Mike