php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #76054 is_a does not accept scalar types
Submitted: 2018-03-05 18:27 UTC Modified: 2021-08-01 04:22 UTC
Votes:1
Avg. Score:2.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: tom at r dot je Assigned: cmb (profile)
Status: No Feedback Package: Reflection related
PHP Version: 7.2.3 OS: any
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: tom at r dot je
New email:
PHP Version: OS:

 

 [2018-03-05 18:27 UTC] 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()




Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-07-20 14:15 UTC] cmb@php.net
-Status: Open +Status: Feedback -Assigned To: +Assigned To: cmb
 [2021-07-20 14:15 UTC] cmb@php.net
ReflectionNamedType::isBuiltin()[1] to the rescue?

[1] <https://www.php.net/manual/en/reflectionnamedtype.isbuiltin.php>
 [2021-08-01 04:22 UTC] php-bugs at lists dot php dot net
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.
 
PHP Copyright © 2001-2022 The PHP Group
All rights reserved.
Last updated: Wed Jul 06 15:03:42 2022 UTC