Bug #69861 [Opn->Nab]: Callable fields are treated as magic __call()
Edit report at https://bugs.php.net/bug.php?id=69861&edit=1
ID: 69861
Updated by: laruence@php.net
Reported by: php at developerjack dot com
Summary: Callable fields are treated as magic __call()
-Status: Open
+Status: Not a bug
Type: Bug
Package: Scripting Engine problem
Operating System: All
PHP Version: 7.0.0alpha1
Block user comment: N
Private report: N
New Comment:
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
Previous Comments:
------------------------------------------------------------------------
[2015-06-17 11:58:39] php at developerjack dot com
A copy of the bug report in 3v4l.org - I found this useful to debug and play with to reproduce.
http://3v4l.org/gQHkU
------------------------------------------------------------------------
[2015-06-17 11:55:50] 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.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=69861&edit=1
Thread (3 messages)