spl_autoload_register(function($className){
// тут код автозагрузки
});
Цитата (J1upuk @ 20.09.2015 - 12:49) |
Познакомился с автоматической загрузкой классов, с функциями spl_autoload_...[,register, functions, ...], но так и не понял что делает spl_autoload()???;, с магическим методом __autoload() всё проще, мы его просто описываем там, где нужно автоматически подключать класс, но он вроде как скоро будет depricated. |
Цитата |
spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию. |
Цитата |
Эта функция представляет из себя базовую реализацию метода __autoload(). Если пользователь не определил свою реализацию, и spl_autoload_register() вызывается без параметров, то при каждом последующем вызове __autoload() будет работать именно эта функция. |
<?php
function spl_autoload($name)
{
include $name.'.php';
}
$obj = new class1();
<?php
spl_autoload_register();
$obj = new class1();
spl_autoload('myсlass'); // будут искаться все описания классов в по всем include-путям в файлах *.inc и *.php
spl_autoload('myсlass', 'class'); // будут искаться все описания классов в по всем include-путям в файлах *.class
spl_autoload_register(function ($className) {
$classPath = func_get_class_path($className);
$fileName = ROOT_DIR . DIRSEP . $classPath;
if (!file_exists($fileName)) {
throw new excep_code ("Ошибка подключения класса [ {$fileName} ] через spl_autoload_register", 404);
} else {
require_once $fileName;
}
});
Цитата (icedfox @ 22.09.2015 - 04:31) |
поэтому путь формируется на их основании через дополнительную функцию func_get_class_path() |
function spl_autoload($classname, $ext)
{
include $classname . $ext;
}
Цитата (twin @ 22.09.2015 - 12:56) |
И зачем? Поменять слэш с обратного на прямой - целую дополнительную функцию воротить... |
Цитата (twin @ 22.09.2015 - 13:36) |
Кстати, у той же SMARTY есть свой загрузчик |
Цитата (twin @ 22.09.2015 - 14:29) |
Не совсем понял. По какому сценарию? |
Цитата (twin @ 22.09.2015 - 14:29) |
Покажите, как устроена func_get_class_path(), мож я чего не понял. |
if (preg_match('/^smarty_\w+$/i', $className)) {
$fileName = SMARTY_DIR_LIB. '/sysplugins/' .$className. '.php';
}
function func_get_class_path($class) {
$namespace = func_get_namespace($class);
$className = func_get_className($class);
$className = preg_split("/(?=[A-Z]{1}+[a-z])/", $className); // Ищем заглавные буквы и по ним формируем массив
$className = implode('_',$className); // Из массива формурем строку ставя знак '_'
$className = trim($className, '_'); // чистим с краев лишние знаки '_'
$className = str_replace('__','_',$className); // чистим повторяющиеся знаки '_'
$className = mb_strtolower($className); // приводим к нижнему регистру
if (preg_match('/^[a-zA-Z._]*class*+$/i', $className)) {
$className = str_replace('_class','.class',$className); // если нашли слово class, то меняем '_' на '.'
}
elseif (preg_match('/^[a-zA-Z._]*trait*+$/i', $className)){
$className = str_replace('_trait','.trait',$className); // если нашли слово trait, то меняем '_' на '.'
} else {
$className .= '.class'; // если нчего не нашли, то добавляем в конец '.class'
}
$className = $namespace . $className . '.php'; // добавляем путь из 'namespace' и расширение файла
return $className;
}