2013-02-13 2 views
6

Есть ли способ для меня различать черты и классы в моей функции автозагрузки? Скажем, у меня есть папка классов и папка с чертами; было бы неплохо, чтобы иметь возможность сделать что-то вроде ...Автозагрузка черт в PHP

spl_autoload_register(function($resource) { 
    if (/* $resource is class */) { 
    include 'classes/'.$resource.'.php'; 
    } 
    if (/* $resource is trait */) { 
    include 'traits/'.$resource.'.php'; 
    } 
}); 
+1

ваши, вероятно, хочет изменить свой второй '' if' к elseif' – shnisaka

+0

не похоже. Нет информации, кроме имени символа, переданного обратному вызову. Вероятно, вы должны создать ошибку с PHP – Phil

+0

@shnisaka Это не имеет смысла. Зачем использовать 'elseif', если условия взаимоисключающие? – Phil

ответ

4

Функция автозагрузку обратного вызова получает только одну часть информации; запрошено имя символа. Нет никакого способа увидеть, какой тип символа он должен быть.

Что вы можете сделать, это зарегистрировать несколько функций в стеке автозагрузку, один для обработки классов и другие черты, используя stream_resolve_include_path() или что-то подобное, например

spl_autoload_register(function($className) { 
    $fileName = stream_resolve_include_path('classes/' . $className . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
spl_autoload_register(function($traitName) { 
    $fileName = stream_resolve_include_path('traits/' . $traitName . '.php'); 
    if ($fileName !== false) { 
     include $fileName; 
    } 
}); 
+0

Спасибо, мое быстрое решение заключалось в использовании 'file_exists()'. Я никогда не использовал 'stream_resolve_include_path()' раньше, и документация довольно расплывчата ... что это точно? И какие преимущества связаны с регистрацией двух функций автозагрузки? –

+0

@savinger Ну, 'include' использует сконфигурированный' include_path'. 'file_exists()' не знает об этом, тогда как 'stream_resolve_include_path()' делает. Он возвращает 'false', если он не может разрешить данный путь по стеку' include_path' – Phil

0

Существует простое решение, как вы имя ваши черты. Каждая черта в моем приложении называется trait_ (имя) и помещается в папку классов.

Например, my trait_something помещается в классы/папку под именем файла "trait.trait_something.php".

Моей функция автозагрузки может подобрать либо черту или классы:

function autoloader($class) 
{ 
    $prefix='classes/'; 
    $ext='.php'; 
    if(substr($class,0,6) == 'trait_')include $prefix.'trait.' . $class . $ext; 
    else include $prefix.'class.' . $class . $ext; 
} 

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

  • Нет связанных вопросов^_^