|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #69861 Callable fields are treated as magic __call()
Submitted: 2015-06-17 11:55 UTC Modified: 2015-06-17 13:09 UTC
From: php at developerjack dot com Assigned:
Status: Not a bug Package: Scripting Engine problem
PHP Version: 7.0.0alpha1 OS: All
Private report: No CVE-ID: None
 [2015-06-17 11:55 UTC] php at developerjack dot com
If a class has a magic __call() method, fields which are closure are not invoked.

The result being that the $args param to __call() exceeds memory limits due to nesting recursively (and, depending on recursion and memory limits does not report as a recursion limit reached).

On preliminary review, this may be related to the callable types and Classname::method() syntax:

Test script:
class CallableStub {
    protected $callback = null;
    public function setCallback(callable $callback) {
        $this->callback = $callback;
    public function __call($name, $args) {
        if($this->callback == null || !is_callable($this->callback)) {
            throw new \LogicException("CallableStub requires a callback function to be callable.");

        //$cb = $this->callback; // $cb(); use a locl variable instead and it works!
        return $this->callback($name, $args);

$s = new CallableStub();
$s->setCallback( function ($x, $y) { var_dump(func_get_args()); });
$s->frankfurt('rabbit stew');

Expected result:
--- expected ---
$this->callback($someArgs);// invoke the closure in $this->callback;

Actual result:
--- actual ---
$this->callback($someargs);// invokes __call('callback', [$someargs]);


Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 262144 bytes) in /in/cg4kJ on line 16

Process exited with code 255.


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2015-06-17 11:58 UTC] php at developerjack dot com
A copy of the bug report in - I found this useful to debug and play with to reproduce.
 [2015-06-17 13:09 UTC]
-Status: Open +Status: Not a bug
 [2015-06-17 13:09 UTC]
use instead ($this->callback)($name, $args)
$this->callback means a method call..
($this->callback)() means a property value as callable

also take a look at this:

class A {
    public $test = NULL;
    function test() {

$a = new A();

$a->test = function() {


PHP Copyright © 2001-2022 The PHP Group
All rights reserved.
Last updated: Fri Dec 02 02:05:53 2022 UTC