воскресенье, апреля 26

PHP __autoload

Попалась тут задачка...
есть несколько вариантов написания библиотек с классами... почему так? потому что разные источники и у каждого свои исторически сложившиеся наименования...

В частности их было 3:
1) ClassName.class.php
2) ClassName.php
3) class/ClassName.php

где ClassName - имя вызываемого класса.

естественно, что решение с простым использованием include/require в функции __autoload в данном случае не подходил.

в итоге пришёл вот к такому коду:

function __autoload($className){
if (is_file('class/' . $className . '.php')) {
include_once ('class/' . $className . '.php');
} elseif (is_file($className . '.class.php')) {
include_once ($className . '.class.php');
} elseif (is_file($className . '.php')) {
include_once ($className . '.php');
} else {
throw new ErrorException('Не удаётся закрузить класс "' . $className . '"');
}
}

3 комментария:

  1. Оторвал бы руки нахрен

    ОтветитьУдалить
  2. А вы слыхали про file_exists() или is_file()? А вы знаете что собака @ - плохой тон, и будет убрана из php6.
    Советую вам взглянуть как работают функции автолоада в фреймворках, ну хотя бы CI.
    P.S. Тоже бы руки оборвал

    ОтветитьУдалить
  3. не надо руки отрывать - они мне нужны ещё :)

    Я не спорю, что is_file (кстати, file_exists не катит - он и на директорию скажет TRUE) лучше, но для той задачки того, что я написал было достаточно на тот момент :)

    огладываясь сейчас вижу больше ошибок (помимо тех, что озвучили вы) - например наличие var_dump

    в общем, вместо
    function __autoload($className){
    if (!(@include_once('class/'.$className.'.php')))
    if (!(@include_once($className.'.class.php')))
    if (!(@include_once ($className.'.php')))
    var_dump($className);
    }


    сейчас написал бы так:
    if (is_file('class/' . $className . '.php')) {
    include_once ('class/' . $className . '.php');
    } elseif (is_file($className . '.class.php')) {
    include_once ($className . '.class.php');
    } elseif (is_file($className . '.php')) {
    include_once ($className . '.php');
    } else {
    throw new ErrorException('Не удаётся закрузить класс "' . $className . '"');
    }


    ЗЫ: а наличие var_dump значит вас устроило, да?

    ОтветитьУдалить