|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #76028 call_user_func($a) and $a() behave differently
Submitted: 2018-02-28 14:33 UTC Modified: 2021-09-16 12:37 UTC
Avg. Score:2.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:0 (0.0%)
From: bburnichon at gmail dot com Assigned:
Status: Verified Package: Scripting Engine problem
PHP Version: 7.1 OS: Linux
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
Block user comment
Status: Assign to:
Bug Type:
From: bburnichon at gmail dot com
New email:
PHP Version: OS:


 [2018-02-28 14:33 UTC] bburnichon at gmail dot com
A callable can be defined as an array containing class and method.

Calling call_user_func() with such an array has no issue.
If you try to use the array as a callable, then 'self' loose its special meaning and an error is triggered saying class self does not exists.

Test script:

class CallBySelf
    public static function foo()
        echo 'Foo', PHP_EOL;
    public static function testCall()
        $method = ['self', 'foo'];
        echo 'Call via call_user_func: ';
        echo 'Direct call: ';


Expected result:
Call via call_user_func: Foo
Direct call: Foo

Actual result:
Call via call_user_func: Foo
Direct call: 
Fatal error: Class 'self' not found in /in/Ssgep on line 19


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2018-02-28 14:38 UTC] bburnichon at gmail dot com
Checked versions having the issue with
 [2018-02-28 15:24 UTC]
-Package: PHP Language Specification +Package: Scripting Engine problem -PHP Version: 5.6.33 +PHP Version: 7.1
 [2018-02-28 17:39 UTC]
FWIW: don't use the string 'self', but rather self::class,
see <>.
 [2018-02-28 17:54 UTC] bburnichon at gmail dot com
Yes, that's what I've done once I discovered the issue. I just wished I knew this before. I've learnt it the hard way while refactoring an old class which was calling 

$method = // Method from user input
$callable = ['self', $method];
if (is_callable($callable)) {


$method = // Whitelisted method
$callable = [self::class, $method];
 [2021-09-16 12:37 UTC]
-Status: Open +Status: Verified -Type: Bug +Type: Documentation Problem
 [2021-09-16 12:37 UTC]
> I just wished I knew this before.

So yes, this is actually a documentation problem.

Note that as of PHP 8.1.0 you can use


which is even better, since that callable is callable everywhere.
For previous PHP versions, you can use the more verbose

    Closure::fromCallable([self::class, 'foo'])

to have the same benefit.
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Jul 18 20:01:28 2024 UTC