PHP 5.3: call_user_func_array propagates $this...

demon_goo

Новичок
PHP 5.3: call_user_func_array propagates $this...

"call_user_func() now propagates $this even if the callee is the parent class"

Если кто-нибудь понимает, что означает эта фраза (взята из back imcompatibility для PHP 5.3), объясните, пожалуйста. Я понимаю отдельные слова но в целом - нет.

Конкретно для меня это вылилось что рабочий на 5.2 код выдаёт Segfault на 5.3, код такого вида:

PHP:
class A {}

class B extends A
{
	public function __construct()
	{
		$args = func_get_args();
		call_user_func_array(array($this, 'parent::__construct'), $args);
	}
}

class C extends B
{
}

$instance = new B(); // работает
$instance = new C() // падает в Segfault
Вот в этой ссылке на http://bugs.php.net/ товарищ тоже встретился с такой проблемой и в последнем комменте даже есть решение:
Thanks for the report. From the UPGRADING:

call_user_func() now propagates $this even if the callee is
the parent class

This includes the class to which the call is relative, might not be
clear from the entry.

The fix for the code would be replacing parent::x with A::x.
Но... я не могу понять - ПАЧИМУ! :))
 

Alexandre

PHPПенсионер
а чего ты добиваешься своим кодом?
не могу найти его практическую сторону?
 

nerezus

Вселенский отказник
> $instance = new C() // падает в Segfault
Если имеет место быть Segmentation fault, то это 100% баг PHP, в багтрекер.
 

demon_goo

Новичок
Автор оригинала: Alexandre
а чего ты добиваешься своим кодом?
не могу найти его практическую сторону?
Ну во первых - код это сведенный к абстракции пример.
Во-вторых я добиваюсь им расширения функциональности перегружаемых методов, оставляя возможность иметь переменное число аргументов.

-~{}~ 23.09.09 15:44:

Автор оригинала: nerezus
> $instance = new C() // падает в Segfault
Если имеет место быть Segmentation fault, то это 100% баг PHP, в багтрекер.
В первом посте была ссылка на багтрекер, и там написано что это не баг :)
 

nerezus

Вселенский отказник
> В первом посте была ссылка на багтрекер, и там написано что это не баг

Т.е. если один из программистом сделает скрипт с ошибкой, но упадет не скрипт, а PHP с апачем - то это не баг?
 

FractalizeR

Новичок
Если SegFault - баг определенно. Не понимаю, почему его Bogus пометили.
 

fixxxer

К.О.
Партнер клуба
Конструктор с var args - ужасное извращение.

Но сегфолтиться конечно не должно )
 

DiMA

php.spb.ru
Команда форума
Какая-то надуманная проблема. В конструкторе парента описываешь все аргументы как есть. Чтобы вызвать конструктор - передаешь все аргументы первым агрументом как массив. Конструктор лишь проверят - массив ли первый аргумент. call_user_func_array не используется, пхп не сглючит.
 

whirlwind

TDD infected, paranoid
у меня на 5.2.9 этот код не работает
Код:
Warning: call_user_func_array(): First argument is expected to be a valid callback, 'C::parent::__construct' was given in /home/whirlwind/work/tmp/tttt.php on line 11

Call Stack:
    0.0006     102736   1. {main}() /home/whirlwind/work/tmp/tttt.php:0
    0.0012     105208   2. B->__construct() /home/whirlwind/work/tmp/tttt.php:20
    0.0012     105208   3. call_user_func_array() /home/whirlwind/work/tmp/tttt.php:11

whirlwind@PLUTO:~/work/tmp$ php -v
PHP 5.2.9 (cli) (built: May  5 2009 03:54:01) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans
    with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
 

r4sh

Новичок
Баг, но тоже не вижу практического применения такого кода.
 

fixxxer

К.О.
Партнер клуба
> http://bugs.php.net/bug.php?id=48680

мдя почитал, разрабы php совсем невменяемы стали

>>segfaults in 5.3
>this is not a bug. Thanks for the report, I'll try to come up with a more clear wording for
UPGRADING and other documentation

5 баллов.
 

nerezus

Вселенский отказник
>this is not a bug. Thanks for the report, I'll try to come up with a more clear wording for
UPGRADING and other documentation

Эээ, это я не понял, они хотят внести в доки, что при таких-то строках в любом скрипте должен падать вебсервер? Или все же пофиксят?
 

fixxxer

К.О.
Партнер клуба
>.они хотят внести в доки, что при таких-то строках в любом скрипте должен падать вебсервер

ДА
 

demon_goo

Новичок
Ну ладно, баг или не баг, есть применение или нет. Для меня - он иногда применим, такой шаблон. Но кто шарит - расшифруйте пожалуйста - в чем цимус этого изменения. Хотя бы чтобы его понять.
Я не могу понять, почему вызов родительского конструктора через функцию call_user_func выдает ошибку (это кстати применимо не только к конструктору, но и к любым методам). Никак не могу ухватить логику данной фразы: "call_user_func() now propagates $this even if the callee is the parent class"
Писец, толи я глуп, толи с ПХП творятся вообще какое-то чудеса :) Спасите мой мозг от коллапса!

whirlwind
у меня на 5.2.9 этот код не работает
Почему у тебя, Дмитрий, не работает этот код я ума не приложу. :)
 

whirlwind

TDD infected, paranoid
PHP:
<?php

class A {

    function __construct($param1, $param2)
    {
        echo "p1: $param1  p2:$param2\n";
    }
}

class B extends A
{
    public function __construct()
    {
        $args = func_get_args();
        call_user_func_array(array('parent','__construct'), $args);
    }
}

class C extends B
{
}

$instance = new B('one', 'two');
$instance = new C('foo', 'bar');

теперь понятно о чем речь? :D
 

fixxxer

К.О.
Партнер клуба
да это фиг с ним.

как бы есть разница между "не работает" (что можно действительно задокументировать, показав альтернативу) и сегфолтом.
 

demon_goo

Новичок
Автор оригинала: whirlwind
PHP:
...
call_user_func_array(array('parent','__construct'), $args);
...

теперь понятно о чем речь? :D
Если это тот код что не работал - то понятно.
Должно быть так:

PHP:
call_user_func_array(array($this, 'parent::__construct'), $args);
 
Сверху