Форум → Программирование → PHP для идиотов → поддержка замыканий
поддержка замыканий
-
Стоит версия 5.3.2
Прочитав вики по замыканиям (http://wiki.php.net/rfc/closures) решил попробовать.
Обнаружил, что вопреки вики ReflectionMethod не поддерживает getClosure() а также при использовании замыкания в методе объекта туда не импортируется автоматом $this (Fatal error: Using $this when not in object context), что приводит к не видимости области видимости класса,т.е. не возможности использовать не публичные методы и свойства
Чё бля за херня? -
Авг. 21, 2010, 5:40 п.п., спустя 13 минут 35 секунд
и static function() use () не пашет…Спустя 102 сек.а теперь я еще время померал:
в среднем, для моей задачи
Closure: 4.2417922019958E-5
Call user func: 3.0434999465942E-5
Вывод - опен сорс - гавно -
Авг. 21, 2010, 8:06 п.п., спустя 2 часа 26 минут 33 секунды
куски кода давай а не мысли своиСапожник без сапог -
Авг. 21, 2010, 8:42 п.п., спустя 35 минут 9 секунд
держи, последнее что было… Это я хотел свой бб парсер переписать с call_user_func на closure, думал будет бытрее да и closure попробовать… Там два конечных автомата, верхний старый, ниже новый и начало парсера, в самом низу типа тесты -
Авг. 21, 2010, 8:46 п.п., спустя 4 минуты 31 секунду
нихуя не понял.а теперь я еще время померал:
в среднем, для моей задачи
Closure: 4.2417922019958E-5
Call user func: 3.0434999465942E-5
ага. на 1 итерацию, молодец!
какой нах статик клосуре? это чо ваще? :-DСапожник без сапог -
Авг. 21, 2010, 9 п.п., спустя 13 минут 33 секунды
ага. на 1 итерацию, молодец!
это сдернее по одному знаменателю, умнож на количество получишь такое же отношение, йоу!какой нах статик клосуре? это чо ваще? :-D
а хрен знает, я смотрю по вики, а где еще можно я фиг знаю где:Because not all closures defined in class methods need $this, it is possible to declare a lambda function to be static:
class Example {
public function doSomething () {
$x = 4;
$closure = static function ($y) use ($x) {
return $x + $y;
};
return $closure (6);
}
}
In this case, $this is not available inside the closure. This may save a lot of memory if saves many closures that originated in longer needed objects. -
Авг. 21, 2010, 9:02 п.п., спустя 2 минуты 35 секунд
а в каком коде у тебя ругается?Сапожник без сапог -
Авг. 21, 2010, 9:23 п.п., спустя 21 минуту 10 секунд
Меня интересует это:private function _startBb()
{
$parser = $this;
$closure = function($char) use ($parser) {
$a = 1 + 1;
//$parser->_a = 1 + 1;
//echo $parser->_a;
};
return $closure;
}
Судя из вики, я так понял $this можно не передавть как тут я написал, а сразу использовать, но если там написать вместо $parser $this->_a как бы к приватной (она был приватной) но нифига типа $this не катит, а я думал будет катить… -
Авг. 21, 2010, 10:04 п.п., спустя 40 минут 16 секунд
kostyl, нет, нельзя приватные конечно менять. их не видно снаружиСапожник без сапог -
Авг. 24, 2010, 2:43 д.п., спустя 2 дня 4 часа 39 минут
еще натолкнулся на такую штуку Exception with message "Serialization of 'Closure' is not allowed". Прикольно!! ))
Но я к чему пишу. Меня всё таки мучила проблема и я решил сделать чуть получше тесты. Суть была в том что из старых тестов вызов замыкания проигрывал вызову пользовательской функции. Какой же я был лох.
Я еще добавил вызов непосредственно метода у объекта и опять начал мерять. Менял код добавлял удалял и наконец понял, что разница между вызовами этими тремя способами настолько мала, что она проигрывает разницам в вызовах isset vs empty в моём коде, а так как у меня были немного разные функционалы я привёл всё к общему знаменателю, максимально сократил код в вызываемых методах (удалил его нахуй) и получил довольно логичную картину:
большинство опытов дают такие средние числа:
Call closure: 0.22893398761749
Call user func: 0.2867635011673
Standart object method call: 0.23807461261749
То есть само быстро - вызов обычной функции, чуть дольше вызов метода объекта и еще дольше пользовательский вызов… Надо бля как нить открыть исходы пыха и бля хоть раз глянутьСпустя 113 сек.ну это хуйня, то что я хотел всё равно не поддерживается… -
Авг. 24, 2010, 2:55 д.п., спустя 12 минут 8 секунд
короче вывод:
Половину вики по замыканиям я не так понял
Вторая половина вики по замыканиям не работает
(написал именно "вики по замыканиям" потому, что когда я без этих слов прочитал и вспомнил что есть имя Вика, то чуть не уссался от ржачки )
и самый главный вывод, в моей задаче похуй, что юзать. -
Авг. 24, 2010, 6:28 д.п., спустя 3 часа 33 минуты 8 секунд
а чо ты хател, технология новая для пхп, качество реализации пхп ты сам понимаешь - все норм, пару лет на говне поездим, потом можно хвастаться им :)Сапожник без сапог -
Авг. 24, 2010, 11:47 д.п., спустя 5 часов 18 минут 40 секунд
поздно будет
а чо ты хател, технология новая для пхп, качество реализации пхп ты сам понимаешь - все норм, пару лет на говне поездим, потом можно хвастаться им :)https://smappi.org/ - платформа по созданию API на все случаи жизни -
Авг. 24, 2010, 11:49 д.п., спустя 1 минуту 36 секунд
adw0rd, да и похуй, давно на пых клали разработчики имхо, развивают кал всякий) хотя те же замыкания прикольная штучка, но в жсе они давно, у нас тока щаСапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!