#18926 [Opn->Bgs]: call_user_func_array does not mirror normal scope inside class functions
| From: | sterling@php.net | Date: | Mon, 28 Oct 2002 20:10:30 +0000 |
| Subject: | #18926 [Opn->Bgs]: call_user_func_array does not mirror normal scope inside class functions | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-23591@lists.php.net to get a copy of this message | ||
ID: 18926
Updated by: sterling@php.net
Reported By: tater@potatoe.com
-Status: Open
+Status: Bogus
Bug Type: Scripting Engine problem
Operating System: Mac OS X 10.1.5 / Darwin 5.5
PHP Version: 4CVS-2002-08-15
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
Previous Comments:
------------------------------------------------------------------------
[2002-08-15 21:09:04] tater@potatoe.com
presuming ZE == ZE1.3.0, this is on a vanilla build from CVS
(just checked it out, ran buildconf, then configure w/o options):
<?php
class foo { function from_foo($p) { echo "i am from foo: $p\n"; } }
class bar extends foo {
function test() {
foo::from_foo('foo::from_foo');
call_user_func(
array('foo','from_foo')
,'call_user_func(array(foo,from_foo))'
);
parent::from_foo('parent::from_foo');
call_user_func(
array('parent','from_foo')
,'call_user_func(array(parent,from_foo))'
);
}
}
error_reporting(E_ALL);
bar::test();
?>
gives you:
# sapi/cli/php -v
PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
# sapi/cli/php ctest.php
i am from foo: foo::from_foo
i am from foo: call_user_func(array(foo,from_foo))
i am from foo: parent::from_foo
Warning: call_user_func(): First argumented is expected to be a valid
callback, 'parent::from_foo' was given in ctest.php on line 14
------------------------------------------------------------------------
[2002-08-15 20:40:37] kalowsky@php.net
can you please give a ZE example?
------------------------------------------------------------------------
[2002-08-15 20:26:30] tater@potatoe.com
You see the same behavior with PHP 4.3.0-dev and ZE1.3 for 'parent'.
Calls to 'self' and the change in function name scope are ZE2 only
features anyway (I think).
------------------------------------------------------------------------
[2002-08-15 20:09:25] kalowsky@php.net
Is this with ZE2 or ZE1?
------------------------------------------------------------------------
[2002-08-15 17:10:04] tater@potatoe.com
Using call_user_func_array() inside a class function produces different
results from the equivalent direct function calls.
call_user_func_array(array('self,'method'), $args) gives an error,
although self::method() works, as does
call_user_func_array(array('myclassname','method'), $args).
(This format for calling static class methods is undocumented, by the
way - is it officially even supposed to work?)
Also, in PHP 4.3-dev, a call to myfunction() inside a class function
will check the current class's function table first, before calling a
globally defined function. But call_user_func_array('myfunction',$args)
does not - it only looks for global functions.
Whether any of these things are bugs or features, I don't know.
test script:
<?php
class foo
{
function myname() { return 'foo'; }
function myself()
{
$args = func_get_args();
echo '<li>', self::myname(), '::myself - my args are
',var_export($args,TRUE),"\n";
}
}
class bar extends foo
{
function myname() { return 'bar'; }
function test()
{
foo::myself('calling foo::myself');
bar::myself('calling bar::myself');
self::myself('calling self::myself');
parent::myself('calling parent::myself');
call_user_func_array(array('foo','myself'),
array('call_user_func_array on array("foo","myself")'));
call_user_func_array(array('bar','myself'),
array('call_user_func_array on array("bar","myself")'));
call_user_func_array(array('parent','myself'),
array('call_user_func_array on array("parent","myself")'));
call_user_func_array(array('self','myself'),
array('call_user_func_array on array("self","myself")'));
myself('calling myself');
call_user_func_array('myself', array('call_user_func_array on
"myself"'));
}
}
function myself()
{
echo '<li>i am the external function myself - my args are ',
var_export(func_get_args(), TRUE), "\n";
}
bar::test('testing',1,2);
?>
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=18926&edit=1