|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-08-15 17:10 UTC] carl at thep dot lu dot se
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);
?>
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 21:00:01 2025 UTC |
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 14The convention for this is to use array(&$obj, "method") instead of $function_name. So:- class foo { function one() { echo "one"; } function two() { $args = func_get_args(); call_user_func_array(array(&$this, "one"), $args); } }; $foo = new foo(); $foo->two(); Thats the equivalent to $this->one(); within $this->two(); The question is how do you inherit foo and call parent::two(); from within bar (thus calling foo->two(); Not bar->two(); )