Bug #76054 [Fbk->NoF]: is_a does not accept scalar types
| From: | php-bugs at lists dot php dot net | 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