On Sun, Jun 21, 2015 at 6:26 PM, Rasmus Lerdorf <ras...@lerdorf.com> wrote:
> Is it deliberate that we are not providing the parameter types for > internal functions via reflection? It seems inconsistent: > > <?php > declare(strict_types=1); > function ustrlen(string $str) { } > $param_ustrlen = (new > ReflectionFunction('ustrlen'))->getParameters()[0]; > $param_strlen = (new ReflectionFunction('strlen'))->getParameters()[0]; > > echo "$param_ustrlen (".$param_ustrlen->hasType().")\n"; > echo "$param_strlen (".$param_strlen->hasType().")\n"; > > try { > ustrlen(1); > } catch (TypeError $e) { > echo $e->getMessage()."\n"; > } > > try { > strlen(1); > } catch (TypeError $e) { > echo $e->getMessage()."\n"; > } > > The output is: > > Parameter #0 [ <required> string $str ] (1) > Parameter #0 [ <required> $str ] () > Argument 1 passed to ustrlen() must be of the type string, integer > given, called in /home/rasmus/prop.php on line 11 > strlen() expects parameter 1 to be string, integer given > > That is, in both cases a TypeError exception is raised because the type > of the parameter is incorrect. But hasType() on the internal function > parameter claims there is no type even though there obviously is one. > > -Rasmus > The difference here is that ustrlen() has an argument type specified in arginfo, while strlen() triggers an error through zend_parse_parameters(). We have practically no arginfo-level type annotations in the standard library. Nikita