Есть ли способ динамически изменить имя класса, который загружается автоматически? - PullRequest
2 голосов
/ 03 мая 2011

Например, скажем, у меня есть следующий код.

$foo = new bar();

И такой автозагрузчик.

function autoload($class_name) {
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

Но класс, который я действительно хочу загрузить, находится в папке 'foo / bar.php ', а реальное имя класса на самом деле - foo_bar.Есть ли способ динамически изменить имя класса, который загружается автоматически?Например, что-то вроде этого?

function autoload(&$class_name) {
    $class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
    }
}

Я знаю, возможно ли что-то подобное, это не совсем лучшая практика, но я все равно хотел бы знать, так ли это.

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

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

Если вы вызываете класс X, вы не можете волшебным образом дать PHP-класс Y.

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

PS
Я тоже давно хотел этого.Когда у меня еще не было доступа к пространствам имен.Теперь, когда я это сделаю, все мои проблемы будут решены =) Если у вас есть доступ к пространствам имен, вам следует «изучить» PSR-0 .

0 голосов
/ 03 мая 2011

Может быть, вы можете использовать class_alias , таким образом:

  • PHP требует класс X
  • Вы хотите загрузить класс Y вместо.
  • Вы создаете псевдоним X для класса Y, поэтому X будет вести себя как Y.

Например:

function autoload($class_name) {
    $real_class_name = 'foo_' . $class_name;
    $class_file_name = str_replace('_', '/', $real_class_name) . '.php';
    if (file_exists($class_file_name)) {
        include($class_file_name);
        class_alias($real_class_name, $class_name);
    }
}

Надеюсь, он вам поможет.

...