2010-01-21 2 views
6

Я надеялся, что если бы я определить константы в отдельном пространстве имен, например:Автозагрузка констант в PHP?

namespace config\database\mysql; 

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

То, что я мог бы использовать __autoload для автоматического включения их:

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; 

В этом, однако, не работает. __autoload не вызывается для константы, как и для классов, оставляя мне ошибку Undefined constant.

Какой-то способ, которым я могу моделировать класс __autoload для констант?

ответ

7

Попробуйте это (работает на моем сервере):

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

В основном вам нужно создать класс, чтобы действовать в качестве оболочки для констант, но при этом она позволяет __autoload(), чтобы работать, как вы хотели.

+0

Спасибо! Это выглядит многообещающе. Я не хочу устраивать их в фиктивных классах, но, похоже, это работает. – Atli

0

Использование неопределенной константы вызовет предупреждение PHP.

Вы можете написать собственный обработчик ошибок, чтобы поймать предупреждение и загрузить в файл соответствующих констант.

+1

Это не то, о чем спрашивает Атли ... –

+0

Спасибо за предложение. К сожалению, ошибка 'Undefiend constant' является фатальной ошибкой (' E_ERROR'), которую пользовательский обработчик не может поймать. – Atli

+0

Хм. Конечно, это было уведомление, но я не использую 5.3. – Mike

Смежные вопросы