Bug #81036 [Nab]: TypeError is raised instead of implizit type casting
Edit report at https://bugs.php.net/bug.php?id=81036&edit=1
ID: 81036
Updated by: girgias@php.net
Reported by: bugs-php at daniel-siepmann dot de
Summary: TypeError is raised instead of implizit type casting
Status: Not a bug
Type: Bug
Package: *Programming Data Structures
Operating System: Ubuntu
PHP Version: 7.4.19
Block user comment: N
Private report: N
New Comment:
The best way to contribute is to fork the git repo on GitHub (https://github.com/php/doc-en/) and
submit a PR.
In this instance it might make sense to rework the type-juggling page
(https://github.com/php/doc-en/blob/master/language/types/type-juggling.xml) to include information
about it with respect to type declarations.
Previous Comments:
------------------------------------------------------------------------
[2021-05-12 11:06:40] bugs-php at daniel-siepmann dot de
Thanks for the near instant response.
I fully understand that design. Still I'm lacking a proper info within docs. I would like to
figure out how to contribute there.
I guess the design is already documented via "if possible" at https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.strict
?
I would then try to improve that part.
------------------------------------------------------------------------
[2021-05-12 10:27:27] nikic@php.net
Explicit type casts like (int) perform a cast at all costs, even if it makes absolutely no sense --
you can cast "foobar" to int, you can cast [1, 2, 3] to int, you can cast new stdClass to
int.
Type declarations have much stricter rules, even if strict_types is not used. They only allow
conversions if they are "somewhat reasonable". In particular, you can implicitly convert
"10" to 10, but you can't implicitly convert "foobar" to 0. If you want to
do that, you need to use an explicit type cast.
This is by design.
------------------------------------------------------------------------
[2021-05-12 10:23:23] bugs-php at daniel-siepmann dot de
Description:
------------
Given a script without declare_strict but a method with defined return type.
The method returns an integer but the stored value might be a string.
I would expect PHP to do a type cast which works in general.
But it does not work with example string.
Test script:
---------------
class Test
{
protected $property;
public function __construct() {
$this->property = 10;
}
public function getProperty(): ?int {
return $this->property;
}
public function setProperty($value) {
$this->property = $value;
}
}
$subject = new Test;
var_dump($subject->getProperty()); // works
$subject->setProperty((int) '{$PID.event.import.ismf.storagePid}'); // works
var_dump($subject->getProperty()); // works
$subject->setProperty('{$PID.event.import.ismf.storagePid}'); // works
var_dump($subject->getProperty()); // breaks
Expected result:
----------------
I would expect the last line to return the integer 0 instead of an TypeError.
Actual result:
--------------
The script fails with
PHP Fatal error: Uncaught TypeError: Return value of Test::getProperty() must be of the type int,
string returned
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81036&edit=1
Thread (4 messages)