php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #38992 ReflectionMethod::invoke() and ::invokeArgs() static method calls should match
Submitted: 2006-09-29 13:15 UTC Modified: 2010-12-20 14:17 UTC
Votes:8
Avg. Score:4.1 ± 0.9
Reproduced:7 of 7 (100.0%)
Same Version:2 (28.6%)
Same OS:1 (14.3%)
From: matthew at zend dot com Assigned: johannes
Status: Assigned Package: Reflection related
PHP Version: 5.1.6 OS: Debian SID on i686
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2006-09-29 13:15 UTC] matthew at zend dot com
Description:
------------
ReflectionMethod::invoke() and ReflectionMethod::invokeArgs() implementations currently do not support the same functionality.

Currently, ReflectionMethod::invoke() can be called using a string class name as the first argument *if* the method is declared static. However, ReflectionMethod::invokeArgs(), called the same way, raises a warning and does not invoke the method:

    Warning: ReflectionMethod::invokeArgs() expects parameter 1 to be object, string given

Calling with a string class name is undocumented currently, but a useful feature to have. I'd request that invokeArgs() be made to match the current invoke() functionality, and the documentation updated to indicate this usage.

Reproduce code:
---------------
<?php
class MyClass
{
    public static function doSomething()
    {
        echo "Did it!\n";
    }
}

$r = new ReflectionMethod('MyClass', 'doSomething');
$args = array();
$r->invoke('MyClass', array());
$r->invokeArgs('MyClass', $args);


Expected result:
----------------
Did it!
Did it!

Actual result:
--------------
Did it!

Warning: ReflectionMethod::invokeArgs() expects parameter 1 to be object, string given in ... line 13

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-05-28 19:37 UTC] andrea at 3site dot it
I suppose this isn't a bug since PHP 5 inherits classes public static methods too (and they call them ... feature ... ).

$r->invoke(new MyClass, array());

This should be expected bahaviour or there's something wrong on this "bogus": http://bugs.php.net/bug.php?id=40886

If this bug will be solved, PHP developers should think about *difference* between public static methods and instances methods, that are two different things, expecially without overload possibility changing arguments or using __call too, that in this case, isn't "so magic", IMHO.
 [2010-12-20 14:17 UTC] jani@php.net
-Package: Feature/Change Request +Package: Reflection related
 [2011-05-11 22:53 UTC] kaplich at gmail dot com
If anybody needs invokeArgs functionality though the following code works fine:

<?
class A
{
	public static function run()
	{
		$class = new ReflectionClass('B');
		$method = $class->getMethod('foo');
		call_user_func_array(array($method, 'invoke'), array('B', 1, 2));
	}
}

class B extends A
{
	public static function foo($v1, $v2)
	{
		echo $v1." / ".$v2;
	}
}

B::run();

Expected result:
----------------
1 / 2

Actual result:
--------------
1 / 2
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 18 18:01:58 2014 UTC