[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс DI от Arh
Страницы: 1, 2
Arh
Как раз класс недавно написал.

$DI = new DI();
$DI->set('Name', new Name, true); //Добавит объект Name в статическое хранилище
$DI->set('Name', new Name); //Добавит объект Name в локальное хранилище

$Name = $DI->get('Name');//Вернёт объект из статического хранилища если его нет в локальном или создаст новый и сам удовлетворит зависимости



Тоже самое с функциями

$DI->set('user', function ($name, $surname) {
return $name . ' - ' . $surname;
});

echo $DI->get('user','Иван','Иванов');



_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Ну и как он по скрости? Сильно рефлексия тормозит?

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

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

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

user posted image
Arh
twin
Цитата
Ну и как он по скрости? Сильно рефлексия тормозит?

Надо потестировать, пока сложно сказать.
Но тут такое дело, большинство популярных классов сама система использует, соответственно они уже есть в контейнере, соответственно получить 1000 раз из контейнера быстрее, чем 1000 раз сделать new.
В общем до рефлексии не часто дело доходит, она вроде как на всяких случай =)
По сути DIC это тюнингованныйс помощью рефлексии SL.
ща сделаю тест

Цитата
Что в объекте, как его зовут, я его, слющай, первий раз в жизни вижю. :)

Не знаю как там по феншуй пользуются DIC, я сейчас делаю так:
Сохраняю имя класса вместе с его пространством имён, сразу понятно что, где лежит.

$Tpl = new \library\Tpl(); //без DIС
$Tpl = $DI->get('\library\Tpl'); // c DIС


и kaww объяснил как сделать автокомплит (phpdoc), становится понятно что это за объект и что он может.

Цитата
В моем фреймворке встроенный DI контейнер в данный момент не нужен. Быть может позже, в виде отдельного компонента.

В принципе согласен. Ни разу не приходилось что то подменять. Вообще всё на статике работало, скорость была бешеная =)
Но если выбирать между тру DI, где зависимости в ручную через запятую передаются в конструктор, и DIC, где нужное дёргается из контейнера, то DIC гораздо удобнее.

Цитата
ArrayAccess

Согласен, очень сбивает с толку.
И chee как то сказал, а я прислушался. Что если есть несколько способов для работы с интерфейсом, то в лучшем случае всё равно будет использоваться только один, так зачем усложнять реализацию и путать всех другим интерфейсом?

$DI->set('name','Вася'); //тут так
$DI['name'] = 'Вася'; //там сяк


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
Тест.
Классы:
class A {

public $B;

function __construct (B $B) {

$this->B = $B;

}

function test () {

return $this->B->run();

}

}


class B {

public $C;

function __construct (C $C) {

$this->C = $C;

}

function run () {

return $this->C->get();


}

}


class C {

function get () {

return __CLASS__;

}

}


Код тестирования без DIC. Время: 0.157
$time = microtime(true);

$i = 0;
while($i <= 1000) {

$C = new C;
$B = new B($C);
$A = new A($B);
echo $A->test();

$i++;
}

echo '<br>Время: '.round(microtime(true) - $time, 4);


Код тестирования рефлексии. Время: 1.101
$DI = new \library\DI();
$time = microtime(true);

$i = 0;
while($i <= 1000) {

echo $DI->get('A')->test(); //Сам удовлетворяет зависимости

$i++;
}

echo '<br>Время: '.round(microtime(true) - $time, 4);


Код тестирования контейнера. Время: 0.148

$DI = new \library\DI();
$DI->set('A', $DI->get('A'));

$time = microtime(true);

$i = 0;
while($i <= 1000) {

echo $DI->get('A')->test(); //В контейнере уже есть готовый экземпляр А

$i++;
}

echo '<br>Время: '.round(microtime(true) - $time, 4);


Как то так:
new - 0.157
из контейнера - 0.148
с рефлексией - 1.101

Я правда не учитывал что нужно делать new DI в цикле, он тоже какие то копейки ест, но тут никак не померишь, потому что инициализация некоторых классов может быть очень ресурсоёмкой, будет выгодней тянуть их из контейнера.

Код инициализации smarty. Время: 0.321
require_once(ROOT_DIR. '/library/smarty/libs/Smarty.class.php');

$time = microtime(true);

$i = 0;
while($i <= 1000) {

$smarty = new Smarty();

$i++;
}

echo '<br>Время: '.round(microtime(true) - $time, 4);


Код инициализации DIC в цикле и возврат объекта smarty. Время: 0.088

require_once(ROOT_DIR. '/library/smarty/libs/Smarty.class.php');

$DI = new \library\DI();
$DI->set('smarty', new Smarty(), true);

$time = microtime(true);

$i = 0;
while($i <= 1000) {

$DI = new \library\DI();
$smarty = $DI->get('smarty');

$i++;
}

echo '<br>Время: '.round(microtime(true) - $time, 4);


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

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