[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: AdcAutoloader.php
Страницы: 1, 2, 3, 4
twin
Переписал, всего делов то реплэйсом. :)
Остался нерешенным один вопрос. Вот это место мне не нравится:
    $currentDir = __DIR__;
$pos = stripos($currentDir, $this->repo);
$baseDir = substr($currentDir, 0, $pos);
$project = !empty($this->config['projectPpath']) ? $this->config['projectPpath'] .'/' : $this->version;
Здесь юзается $this-> вне метода. Очень некрасиво. Есть несколько решений, но все имеют недостатки.

1. Затолкать в класс, и передать данные параметрами. Тогда придется запускать класс после инклюда, а для этого понадобится еще одно ветвление. Если селекторов будет больше одного, их тоже нужно группировать в свой класс. Лишний файл плюс директория. А хотелось бы минимализма. :)

2. Затолкать его в базовый класс отдельным методом. Решается проблема с инклюдом в методе, но нарушается принцип единственной ответственности.

3. Оставить как есть - совсем не нравится.

Есть другие предложения?

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

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

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

user posted image
twin
Цитата (OleKh @ 9.10.2015 - 09:45)
но для фреймворка не подойдет, т.к. рекурсивно не подгружает классы во вложенных директориях.

Он ничего не должен подгружать рекурсивно. Кстати твой второй пример тоже ничего рекурсивно не делает. Ты просто не так понимаешь назначение префикса. Мой не юзает префиксы, потому я и написал - упрощенный вариант.

Но если правильно написать полный путь к классу, начиная от производителя или от названия проекта, то все подключится, как глубоко не находилось бы.



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

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

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

user posted image
OleKh
Цитата (twin @ 9.10.2015 - 12:04)
Он ничего не должен подгружать рекурсивно.


spl_autoload_register() рекурсивно подгружает все классы которые будут находиться в папке vendor.

Цитата (twin @ 9.10.2015 - 12:04)
Но если правильно написать полный путь к классу, начиная от производителя или от названия проекта, то все подключится, как глубоко не находилось бы.


Дайте реальный пример. То, что заявлено в начале как примеры 1 и 2, не работают.

Задайте себе вопросы:
1. Какие классы надо инклудить при загрузке фреймворка для последующего запуска run() ?
2. Зачем инклудить сразу все классы ядра и компонентов? а их может быть оооочень много.
twin
Цитата (OleKh @ 9.10.2015 - 10:20)
Дайте реальный пример. То, что заявлено в начале как примеры 1 и 2, не работают.

Чтобы показать в действии, нужно структуру создать. Еще немножко осталось, оформлю на гитхаб и посмотришь.

Цитата
spl_autoload_register() рекурсивно подгружает все классы которые будут находиться в папке vendor.
Так и хочется сказать, марш в мануал! smile.gif Но я скажу иначе. Нет, это не так. Она вообще ничего не подключает. Тут подробности.

Цитата (OleKh @ 9.10.2015 - 10:20)
1. Какие классы надо инклудить при загрузке фреймворка для последующего запуска run() ?

run() тут вообще не причем. Будут подгружаться только те классы, которые вызваны в контексте.

Цитата
2. Зачем инклудить сразу все классы ядра и компонентов? а их может быть оооочень много
Никто этого не делает, см. выше.

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

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

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

user posted image
Oyeme
Цитата
1. Затолкать в класс, и передать данные параметрами. Тогда придется запускать класс после инклюда, а для этого понадобится еще одно ветвление. Если селекторов будет больше одного, их тоже нужно группировать в свой класс. Лишний файл плюс директория. А хотелось бы минимализма.  smile.gif

2. Затолкать его в базовый класс отдельным методом. Решается проблема с инклюдом в методе, но нарушается принцип единственной ответственности.

3. Оставить как есть - совсем не нравится.

Есть другие предложения?


Класс Config.Уже миллион раз писалось.

И так же autoLoader тоже сделайте как отдельный класс.И передавайте уже данные между cобою.

Everything's an object.
twin
Цитата (Oyeme @ 9.10.2015 - 10:50)
Класс Config.Уже миллион раз писалось.

Это не подходит. Я тоже миллион раз писал почему. Вот допустим. Я хочу нулевой уровень вхождения. А тут прямо с конфиги - класс. Не гоже.

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

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

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

user posted image
twin
Цитата (Oyeme @ 9.10.2015 - 10:50)
Everything's an object

И это устал повторять.
И как тогда это объяснить? Если Everything's? smile.gif

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

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

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

user posted image
OleKh
Цитата (twin @ 9.10.2015 - 12:27)
Чтобы показать в действии, нужно структуру создать.

для теста автолоадера структура уже создана, что еще создавать, добавьте пару папок и один файл и покажите что у вас получится


vendor
-abc
--core
---config
----config.php
-vendor.php
-vendor1.php
-vendor2.php
autoloader.php




Цитата (twin @ 9.10.2015 - 12:27)
Так и хочется сказать, марш в мануал! smile.gif Но я скажу иначе. Нет, это не так. Она вообще ничего не подключает. Тут подробности.


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

Вот пример как рекурсивно отрабатывает ваш автолоадер. Если бы не было рекурсии массив $loaded_class заполнился бы в цикле классами от 1 до 3, а так после каждого вызова функции массив обнуляется.

И все таки что мне тут поправить чтобы подгрузить config.php?


autoloader.php
error_reporting(-1);
header('Content-Type: text/html; charset=utf-8');
//$project_path = !empty($this->config['project_path']) ? $this->config['project_path'] .'/' : 'version/';
$project_path = 'version/';
define('ABC_PROJECT_PATCH', $project_path);

spl_autoload_register(function ($class) {
$loaded_class = array();

$vendor = 'vendor';
$current_dir = __DIR__;

$pos = stripos($current_dir, $vendor);
$base_dir = substr($current_dir, 0, $pos);

$files[] = $vendor .'/'. $class;
$files[] = ABC_PROJECT_PATCH . $class;

foreach ($files as $file) {
$file = str_replace('\\', '/', $base_dir . $file) .'.php';

if(file_exists($file)) {
$loaded_class[] = $file;
include_once $file;
break;
}
}

echo "Массив загружаемых классов <br/>";
echo "<pre>".print_r($loaded_class, 1)."</pre>";

});

$obj= new vendor();
$obj= new vendor1();
$obj= new vendor2();
$obj = new \core\config\config();


vendor.php, vendor1.php, vendor2.php
class vendor {
public function __construct()
{
echo "vendor - Подгрузился и инициализировался <br/>";
}
}


config.php
namespace core\config;
class config {

}



Массив загружаемых классов

Array
(
[0] => vendor/vendor.php
)

vendor - Подгрузился и инициализировался
Массив загружаемых классов

Array
(
[0] => vendor/vendor1.php
)

vendor1 - Подгрузился и инициализировался
Массив загружаемых классов

Array
(
[0] => vendor/vendor2.php
)

vendor2 - Подгрузился и инициализировался
Массив загружаемых классов

Array
(
)

Fatal error: Class 'core\config\config' not found in .../autoloader.php on line 39


Быстрый ответ:

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