型宣言のfloat編。どこまで許容されるのか検証。
Main.php
<?php function to_float($val):float { print "=== val=" . var_export($val, true) . " ===" . PHP_EOL; try { return $val; } catch (TypeError $e) { print $e->getMessage() . PHP_EOL; print $e->getTraceAsString() . PHP_EOL; return -1; } } class Hoge { private int $val; public function __construct($val) { $this->val = $val; } } class MyInteger { private int $val; public function __construct($val) { $this->val = $val; } public function __toString():string { return $this->val; } } var_dump(to_float(0)); var_dump(to_float(00)); var_dump(to_float(123)); var_dump(to_float(0123)); var_dump(to_float(0x123)); var_dump(to_float(0.1)); var_dump(to_float(1.23)); var_dump(to_float(false)); var_dump(to_float(true)); var_dump(to_float("0")); var_dump(to_float("00")); var_dump(to_float("123")); var_dump(to_float("0123")); var_dump(to_float("0x123")); var_dump(to_float("0.1")); var_dump(to_float("1.23")); var_dump(to_float("hello")); var_dump(to_float(null)); var_dump(to_float(new Hoge("123456789"))); var_dump(to_float(new MyInteger("123456789")));
実行結果。
$ php81 Main.php
=== val=0 ===
float(0)
=== val=0 ===
float(0)
=== val=123 ===
float(123)
=== val=83 ===
float(83)
=== val=291 ===
float(291)
=== val=0.1 ===
float(0.1)
=== val=1.23 ===
float(1.23)
=== val=false ===
float(0)
=== val=true ===
float(1)
=== val='0' ===
float(0)
=== val='00' ===
float(0)
=== val='123' ===
float(123)
=== val='0123' ===
float(123)
=== val='0x123' ===
to_float(): Return value must be of type float, string returned
#0 /home/hhelibex/blog/2022-0704-01/Main.php(43): to_float()
#1 {main}
float(-1)
=== val='0.1' ===
float(0.1)
=== val='1.23' ===
float(1.23)
=== val='hello' ===
to_float(): Return value must be of type float, string returned
#0 /home/hhelibex/blog/2022-0704-01/Main.php(46): to_float()
#1 {main}
float(-1)
=== val=NULL ===
to_float(): Return value must be of type float, null returned
#0 /home/hhelibex/blog/2022-0704-01/Main.php(47): to_float()
#1 {main}
float(-1)
=== val=Hoge::__set_state(array(
'val' => 123456789,
)) ===
to_float(): Return value must be of type float, Hoge returned
#0 /home/hhelibex/blog/2022-0704-01/Main.php(48): to_float()
#1 {main}
float(-1)
=== val=MyInteger::__set_state(array(
'val' => 123456789,
)) ===
to_float(): Return value must be of type float, MyInteger returned
#0 /home/hhelibex/blog/2022-0704-01/Main.php(49): to_float()
#1 {main}
float(-1)
$
まぁ、floatへのキャストと挙動は同じですな。取り立てて面白いところがない。