Edit report at https://bugs.php.net/bug.php?id=65432&edit=1
ID: 65432 Updated by: larue...@php.net Reported by: pmjones88 at gmail dot com Summary: ReflectionParameter::isDefaultValueAvailable inconsistent for Closure Status: Open Type: Bug Package: Reflection related Operating System: Mac OS X 10.8.4 PHP Version: 5.4.17 Block user comment: N Private report: N New Comment: it's because, closure use a built-in method Closure::__invoke as a proxy to call the user defined closure function. so, actually you were checking Closure::__invoke Previous Comments: ------------------------------------------------------------------------ [2013-08-09 22:57:39] pmjones88 at gmail dot com Description: ------------ When calling ReflectionParameter::isDefaultValueAvailable() on Closure::__invoke() as an object method, it returns the incorrect value. However, when calling it on a closure as a function, it returns the correct value. Examples below. Test script: --------------- <?php /** * the expected behavior from an object */ class Foo { public function __invoke($baz = 'qux') { return $baz; } } $object = new Foo; var_dump(is_object($object)); // true, so PHP thinks it's an object $method = new ReflectionMethod($object, '__invoke'); // object method exists $params = $method->getParameters(); var_dump($params[0]->isDefaultValueAvailable()); // true /** * now test a closure */ // note the default value $closure = function ($baz = 'qux') { return $baz; }; // treat it as an object: available = false (unexpected) var_dump(is_object($closure)); // true, so PHP thinks it's an object $method = new ReflectionMethod($closure, '__invoke'); // object method exists $params = $method->getParameters(); var_dump($params[0]->isDefaultValueAvailable()); // false // treat it as a function: available = true (expected) $func = new ReflectionFunction($closure); $params = $func->getParameters(); var_dump($params[0]->isDefaultValueAvailable()); // true Expected result: ---------------- I figured, since PHP seems to think the Closure is an object, that one could get a correct isDefaultValueAvailable() from reflecting on __invoke() as an object method (in this case, boolean TRUE). Actual result: -------------- It returns boolean FALSE when reflecting on Closure::__invoke() as an object method. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=65432&edit=1