[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Автозагрузка классов
Страницы: 1, 2
J1upuk
Познакомился с автоматической загрузкой классов, с функциями spl_autoload_...[,register, functions, ...], но так и не понял что делает spl_autoload()???;, с магическим методом __autoload() всё проще, мы его просто описываем там, где нужно автоматически подключать класс, но он вроде как скоро будет depricated.
bestxp
все просто

spl_autoload_register(function($className){

// тут код автозагрузки
});
AllesKlar
Цитата (J1upuk @ 20.09.2015 - 12:49)
Познакомился с автоматической загрузкой классов, с функциями spl_autoload_...[,register, functions, ...], но так и не понял что делает spl_autoload()???;, с магическим методом __autoload() всё проще, мы его просто описываем там, где нужно автоматически подключать класс, но он вроде как скоро будет depricated.

ну, собсстна, в документации написано все:
Цитата
spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.


_____________
[продано копирайтерам]
J1upuk
AllesKlar
Вы не поняли, я знаю что функция spl_autoload_register() регистрирует пользовательский автозагрузчик, добавляя его в стэк, мне не понятно что делает функция spl_autoload() ?
Цитата
Эта функция представляет из себя базовую реализацию метода __autoload(). Если пользователь не определил свою реализацию, и spl_autoload_register() вызывается без параметров, то при каждом последующем вызове __autoload() будет работать именно эта функция.

Не понимаю, как использовать? Допустим в function __autoload($name){...} мы писали тело функции, аргументом передавали имя класса, пробовал писать следующее:

<?php
function
spl_autoload($name)
{
include $name.'.php';
}

$obj = new class1();


Пишет ошибку, мол нельзя редекларировать spl_autoload(), как тогда её использовать? Я просто видимо не догоняю чего-то, объясните пожалуйста.)

UP
Хах, а вот это дело работает, как - ума не приложу :) Ведь я даже не описывал, что и как подключать.)

<?php
spl_autoload_register();

$obj = new class1();

AllesKlar
J1upuk
Перегрузить можно только магические методы, которые в php начинаются с __

spl_autoload() же - это обычная функция, которую ты можешь вызвать, но не переписать.

Т.е.

spl_autoload('myсlass'); // будут искаться все описания классов в по всем include-путям в файлах *.inc и *.php
spl_autoload('myсlass', 'class'); // будут искаться все описания классов в по всем include-путям в файлах *.class


_____________
[продано копирайтерам]
icedfox
Вот примерно так
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;
}
}
);

Используются нэймспейсы , поэтому путь формируется на их основании через дополнительную функцию func_get_class_path()
twin
Цитата (icedfox @ 22.09.2015 - 04:31)
поэтому путь формируется на их основании через дополнительную функцию func_get_class_path()

И зачем? Поменять слэш с обратного на прямой - целую дополнительную функцию воротить...

И вообще, вопрос совсем не про то был. Чтобы проще было понять, функция spl_autoload() по сути тот же include. Если заглянуть внутрь, там примерно так (утрировано):

function spl_autoload($classname, $ext)
{
include $classname . $ext;
}


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
icedfox
Цитата (twin @ 22.09.2015 - 12:56)
И зачем? Поменять слэш с обратного на прямой - целую дополнительную функцию воротить...

Я часть своего кода показал, у меня обернуто в отдельную функцию, т.к. формирование пути не всегда = неймспейсу , допустим из за подключения SMARTY.
twin
Вообще spl_autoload_register() для того и писали, чтобы сделать возможность нескольких реализаций подгрузки. Кстати, у той же SMARTY есть свой загрузчик. Пихать все в один... Это называется - всё что жил, то зря. smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
icedfox
Цитата (twin @ 22.09.2015 - 13:36)
Кстати, у той же SMARTY есть свой загрузчик

Ну-да, ну-да.
Вы проверяли как будет работать собственный spl_autoload_register() и загрузчик SMARTY ?
Проверьте на досуге.
При наличие spl_autoload_register() он будет пытаться подгрузить классы smarty сам и по написанному сценарию.
twin
Не совсем понял. По какому сценарию? Мне лень ставить смарти, чтобы проверить, но на сколько я помню, в ней все эти сценарии прописаны. Зачем еще свой?

Покажите, как устроена func_get_class_path(), мож я чего не понял.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
icedfox
Цитата (twin @ 22.09.2015 - 14:29)
Не совсем понял. По какому сценарию?

В общем, если стоит spl_autoload_register(), то дополнительные классы смарти будут грузиться через него.
Цитата (twin @ 22.09.2015 - 14:29)
Покажите, как устроена func_get_class_path(), мож я чего не понял.

для отлова смарти регулярка
if (preg_match('/^smarty_\w+$/i', $className)) {
$fileName = SMARTY_DIR_LIB. '/sysplugins/' .$className. '.php';
}

Где SMARTY_DIR_LIB путь до самого смарти

Вот так сама функция
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;
}


Код раздуд, но и через 10 лет будет понятен :D
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.