|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2018-02-28 14:33 UTC] bburnichon at gmail dot com
Description:
------------
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:
---------------
<?php
class CallBySelf
{
public static function foo()
{
echo 'Foo', PHP_EOL;
}
public static function testCall()
{
$method = ['self', 'foo'];
var_dump(is_callable($method));
echo 'Call via call_user_func: ';
call_user_func($method);
echo 'Direct call: ';
$method();
}
}
CallBySelf::testCall();
Expected result:
----------------
Call via call_user_func: Foo
Direct call: Foo
Actual result:
--------------
bool(true)
Call via call_user_func: Foo
Direct call:
Fatal error: Class 'self' not found in /in/Ssgep on line 19
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Dec 13 15:00:01 2025 UTC |
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)) { call_user_func($callable); } ``` to ``` $method = // Whitelisted method $callable = [self::class, $method]; $callable(); ```> 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 self::foo(...) 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.