PHP 5.3: call_user_func_array propagates $this...

grigori

( ͡° ͜ʖ ͡°)
Команда форума
обычная бесконечная рекурсия
что по-вашему должно быть, если не сегфолт?

ну да, теперь $this при эвале резолвится особо хитрожопым способом, так что при вызове parent:: вызывается self::
$instance = new B(); тоже сегфолтится, естесно
если это затронуло ваш код - выбросите его
 

demon_goo

Новичок
Автор оригинала: grigori
обычная бесконечная рекурсия
что по-вашему должно быть, если не сегфолт?

ну да, теперь $this при эвале резолвится особо хитрожопым способом, так что при вызове parent:: вызывается self::
$instance = new B(); тоже сегфолтится, естесно
если это затронуло ваш код - выбросите его
$instance = new B(); не сегфолтится, поэтому неестественно

Что ты имеешь в виду под "при вызове parent:: вызывается self::"? Что у инстанса вызывается метод как будто вызван просто $this->method?
 

Alexandre

PHPПенсионер
Ну во первых - код это сведенный к абстракции пример.
Во-вторых я добиваюсь им расширения функциональности перегружаемых методов, оставляя возможность иметь переменное число аргументов.
не надо так делать, используй тогда массив, как указал Дима.
не стоит абстрагироваться до абстрактных абстракций. Это преждевременная оптимизация. Будь проще и у тебя не будет головной боли в виде sigFault ...

как-то мне однажды сказал один разработчик из Рамблера: хочешь быть крутым С++ программером, тогда иди лесом или делай как все.
 

demon_goo

Новичок
Автор оригинала: Alexandre
не надо так делать, используй тогда массив, как указал Дима.
не стоит абстрагироваться до абстрактных абстракций. Это преждевременная оптимизация. Будь проще и у тебя не будет головной боли в виде sigFault ...

как-то мне однажды сказал один разработчик из Рамблера: хочешь быть крутым С++ программером, тогда иди лесом или делай как все.
Вот мне не совсем понятно, почему каждый считает своим долгом выдать какой нибудь перл из области своего мировоззрения. Я использую подобный метод уже года 3 как, а может и все 4. И все прекрасно работало, ничто не предвещало того, что это "преждевременная оптимизация". И не было сегфалтов.
Неужели никому не кажется странным такое извращение над логикой в PHP 5.3, кроме меня? Кончайте пустословить, лучше накликайте вот в этом багрепорте голосов: Bug #48770 - сall_user_func_array() fails to call parent from inheriting class :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
у меня на на 5.3 "$instance = new B(); " таки сегфолтится
я отфонаря не пишу
 

whirlwind

TDD infected, paranoid
только что собрал

Код:
whirlwind@PLUTO:~/work/tmp$ php tttt.php 
Xdebug requires Zend Engine API version 220060519.
The Zend Engine API version 220090626 which is installed, is newer.
Contact Derick Rethans at [url]http://xdebug.org[/url] for a later version of Xdebug.

eAccelerator requires Zend Engine API version 220060519.
The Zend Engine API version 220090626 which is installed, is newer.
Contact eAccelerator at [url]http://eaccelerator.net[/url] for a later version of eAccelerator.

p1: one  p2:two
p1: foo  p2:bar
whirlwind@PLUTO:~/work/tmp$ php -v
Xdebug requires Zend Engine API version 220060519.
The Zend Engine API version 220090626 which is installed, is newer.
Contact Derick Rethans at [url]http://xdebug.org[/url] for a later version of Xdebug.

eAccelerator requires Zend Engine API version 220060519.
The Zend Engine API version 220090626 which is installed, is newer.
Contact eAccelerator at [url]http://eaccelerator.net[/url] for a later version of eAccelerator.

PHP 5.3.0 (cli) (built: Sep 24 2009 02:07:42) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
whirlwind@PLUTO:~/work/tmp$
на мой взгляд все работает как положено

PS. запускал тот вариант, что я приводил
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
demon_goo
девиации не являются темой обсуждения данного форума
используй подобный метод дома в темноте сколько хочешь, но афишировать и защищать права не надо
 

demon_goo

Новичок
Автор оригинала: whirlwind
только что собрал

на мой взгляд все работает как положено

PS. запускал тот вариант, что я приводил
Алилуйя! Спасибо тебе Димон преогромнейшее.

Подытожу в общем случае:

Вместо записи, которая использовалась в 5.1-5.2:
PHP:
call_user_func_array(array($this, 'parent::method'), $args);
в PHP 5.3 нужно писать:
PHP:
call_user_func_array('parent::method', $args);
 

whirlwind

TDD infected, paranoid
Ну рассказал бы к чему мы пришли. А то выглядит буд-то Саша тебя не убедил, а я убедил. Хотя говорили мы одно и то же :)
 

demon_goo

Новичок
Автор оригинала: whirlwind
Ну рассказал бы к чему мы пришли. А то выглядит буд-то Саша тебя не убедил, а я убедил. Хотя говорили мы одно и то же :)
Ну если бы он меня убедил, то тред бы кончился раньше :) В любом случае все это привело к решению, хотя с утра я уже было передумал на текущий проект использовать 5.3 и откатил назад.
 
Сверху