型宣言~float~
型宣言の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へのキャストと挙動は同じですな。取り立てて面白いところがない。