Bug #72305 [Ana]: ReflectionParameter::isCallable is not implemented properly
Edit report at https://bugs.php.net/bug.php?id=72305&edit=1
ID: 72305
Updated by: krakjoe@php.net
Reported by: php at abiusx dot com
Summary: ReflectionParameter::isCallable is not implemented
properly
Status: Analyzed
Type: Bug
Package: Reflection related
Operating System: OS X
PHP Version: 7.0.7
-Assigned To:
+Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Christoph, assigning this to you, can you chase Anatol and find out if this is okay for 7.0.
It's fine in 7.1 and master.
Commit when confirmed, thank you.
Previous Comments:
------------------------------------------------------------------------
[2016-12-10 18:57:40] cmb@php.net
The following patch has been added/updated:
Patch Name: reflection-callable-poc
Revision: 1481396260
URL: https://bugs.php.net/patch-display.php?bug=72305&patch=reflection-callable-poc&revision=1481396260
------------------------------------------------------------------------
[2016-12-10 18:36:49] cmb@php.net
If I'm not mistaken, the API is available as of PHP 7.0.0 by means of
ZEND_ARG_CALLABLE_INFO()[1]. So "only" the arginfo would have to be updated.
[1] <https://github.com/php/php-src/blob/PHP-7.0.0/Zend/zend_API.h#L106>
------------------------------------------------------------------------
[2016-06-08 04:00:02] pollita@php.net
Your analysis is correct. Internal functions don't /really/ have typehints in the way that
userland functions do. What we have instead is c-array which says "object-of-class",
"array", or "other", and whether or not the arg is taken by reference. In other
words, just about the least possible amount of metadata that makes sense.
Types *are* verified for internal functions at runtime, but only during the call during dispatch to
a magic function which plucks args off the stack and coerces them as needed. This is unfortunately
entirely opaque to Reflection. There's just no means to gain visibility using the current
extension api structures.
So to the meat of the issue; Can we fix it? Yes, but not trivially, and certainly not in time for
7.1.
Sorry... :/
------------------------------------------------------------------------
[2016-05-31 17:30:25] php at abiusx dot com
Description:
------------
ReflectionParameter::isCallable always returns false.
Test script:
---------------
<?php
foreach (get_defined_functions()['internal'] as $f)
{
$rf=new ReflectionFunction($f);
for ($i=0;$i<$rf->getNumberOfParameters();++$i)
{
$rp=new ReflectionParameter($f,$i);
if ($rp->isCallable())
echo $f," parameter ",$i,PHP_EOL;
}
}
Expected result:
----------------
It should return true for some parameters of some internal functions, e.g. array_map param0.
Actual result:
--------------
Always false.
As far as I checked, http://lxr.php.net/xref/PHP_7_0/ext/reflection/php_reflection.c#6413
it appears that isCallable is never set in the typehint of the function, and the issue is not with
reflection, but with the way functions are stored.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=72305&edit=1
Thread (7 messages)