|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-06-17 11:55 UTC] php at developerjack dot com
Description: ------------ 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: https://github.com/php/php-src/commit/989a13608b5154672e6ab94f970e271f7d0ae502 Test script: --------------- <?php 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]); Error: 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. PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 18:00:02 2025 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: <?php class A { public $test = NULL; function test() { var_dump(__METHOD__); } } $a = new A(); $a->test = function() { var_dump(__FUNCTION__); }; $a->test(); ($a->test)(); thanks