Автозагрузка констант в PHP? - PullRequest
6 голосов
/ 21 января 2010

Я надеялся, что если бы я определил константы в отдельном пространстве имен, например:

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 для констант?

Ответы [ 2 ]

7 голосов
/ 21 января 2010

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

<?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 голосов
/ 21 января 2010

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

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

...