Bug #76054 [Fbk->NoF]: is_a does not accept scalar types

From: Date: Sun, 01 Aug 2021 04:22:14 +0000
Subject: Bug #76054 [Fbk->NoF]: is_a does not accept scalar types
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-235514@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=76054&edit=1 ID: 76054 Updated by: php-bugs@lists.php.net Reported by: tom at r dot je Summary: is_a does not accept scalar types -Status: Feedback +Status: No Feedback Type: Bug Package: Reflection related Operating System: any PHP Version: 7.2.3 Assigned To: cmb Private report: N New Comment: No feedback was provided. The bug is being suspended because we assume that you are no longer experiencing the problem. If this is not the case and you are able to provide the information that was requested earlier, please do so and change the status of the bug back to "Re-Opened". Thank you. Previous Comments: ------------------------------------------------------------------------ [2021-07-20 14:15:59] cmb@php.net ReflectionNamedType::isBuiltin()[1] to the rescue? [1] <https://www.php.net/manual/en/reflectionnamedtype.isbuiltin.php> ------------------------------------------------------------------------ [2018-03-05 18:27:44] tom at r dot je Description: ------------ I cannot easily work out whether a function can be successfully called with a given set of values if there are scalar type hints. Ideally I'd like to do this: <?php function foo(string $a, callable $bar) { } //I want to check to see whether these arguments can be used to call the function $arguments = [123, 'not-callable!']; //Or these valid arguments // $arguments = ['A string', function() {}]; //This should pass the check // To do this, I need to check to see whether the arguments match the type hint $reflect = new ReflectionFunction('foo'); $valid = true; foreach ($reflect->getParameters() as $i => $param) { if ($param->getType()) { //check to see if the type $arguments[$i] matches the type hint //e.g. would evaluate to is_a('string', 123); if (!is_a($param->getType()->getName(), $arguments[$i])) $valid = false; } } echo $valid ? 'Function foo can be called with supplied $arguments' : '$arguments do not match function definition.'; ?> However, because is_a does not allow scalar types in the first argument, it's not possible. Instead, I need to do this: <?php function foo(string $a, callable $bar) { } //I want to check to see whether these arguments can be used to call the function $arguments = [123, 'not-callable!']; //Or these valid arguments // $arguments = ['A string', function() {}]; //This should pass the check // To do this, I need to check to see whether the arguments match the type hint $reflect = new ReflectionFunction('foo'); $valid = true; foreach ($reflect->getParameters() as $i => $param) { if ($param->getType()) { $type = $param->getType()->getName(); if ($type == 'string' && !is_string($arguments[$i])) $valid = false; else if ($type == 'int' && !is_int($arguments[$i])) $valid = false; else if ($type == 'callable' && !is_callable($arguments[$i])) $valid = false; else if ($type == 'array' && !is_array($arguments[$i])) $valid = false; } } echo $valid ? 'Function foo can be called with supplied $arguments' : '$arguments do not match function definition.'; ?> Or, alternatively, this hacky as hell workaround: <?php function foo(string $a, callable $bar) { } //I want to check to see whether these arguments can be used to call the function $arguments = [123, 'not-callable!']; //Or these valid arguments // $arguments = ['A string', function() {}]; //This should pass the check // To do this, I need to check to see whether the arguments match the type hint $reflect = new ReflectionFunction('foo'); $valid = true; foreach ($reflect->getParameters() as $i => $param) { if ($param->getType()) { if (!call_user_func('is_' . $param->getType()->getName(), $arguments[$i])) $valid = false; } } echo $valid ? 'Function foo can be called with supplied $arguments' : '$arguments do not match function definition.'; ?> Ideally, is_a should support scalar types but perhaps adjusting reflection to allow $param->getType()->willAccept($value); or similar would work as well because at the moment, to determine this, we need to do two checks: One for $param->getClass() and another for $param->getType() ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=76054&edit=1

« previous php.bugs (#235514) next »