я всегда думал, что использование ламбды добавляет некоторый незначительный overhead,
но оказалось, что затраты в точности равны работе с именами классов из строковых констант
тест:
Классы, которые использованы в лямбде, загружаются только при исполнении лямбды, а не при инициализации.
Это позволит, например, в IDE показывать места использования классов в конфигах,
позволит в конфиге yii использовать алиасы, классы и зависимые компоненты, доступные только после инициализации приложения.
но оказалось, что затраты в точности равны работе с именами классов из строковых констант
тест:
PHP:
Class A{}
$x = [];
for ($i=0;$i<10;++$i){
$x[$i] = function(){
return new A();
};
$x[$i]();
};
echo memory_get_usage(true),' ';
# time for i in {1..100}; do php test.php; done;
262144
user 0m0.698s
PHP:
Class A{}
$x = [];
for ($i=0;$i<10;++$i){
$x[$i] = array('class'=>'A');
new $x[$i]['class'];
};
echo memory_get_usage(true),' ';
Вообще, это мысль строить конфиги, DI-контейнеры и определять компоненты приложений не массивами со строковыми константами и плейсхолдерами, не соглашениями с макро-языком для имен параметров, как в symfony, а простым php-кодом в лямбдах:# time for i in {1..100}; do php test.php; done;
262144
user 0m0.695s
PHP:
'myComponent'=>function(CApplication $App){
return Foo::factory('paramN');
}
Это позволит, например, в IDE показывать места использования классов в конфигах,
позволит в конфиге yii использовать алиасы, классы и зависимые компоненты, доступные только после инициализации приложения.
Последнее редактирование: