型宣言のstring編。どこまで許容されるのか検証。
Main.php
<?php function to_string($val):string { 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 ''; } } 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_string(0)); var_dump(to_string(00)); var_dump(to_string(123)); var_dump(to_string(0123)); var_dump(to_string(0x123)); var_dump(to_string(0.1)); var_dump(to_string(1.23)); var_dump(to_string(false)); var_dump(to_string(true)); var_dump(to_string("0")); var_dump(to_string("00")); var_dump(to_string("123")); var_dump(to_string("0123")); var_dump(to_string("0x123")); var_dump(to_string("hello")); var_dump(to_string(null)); var_dump(to_string(new Hoge("123456789"))); var_dump(to_string(new MyInteger("123456789")));
実行結果。
$ php81 Main.php
=== val=0 ===
string(1) "0"
=== val=0 ===
string(1) "0"
=== val=123 ===
string(3) "123"
=== val=83 ===
string(2) "83"
=== val=291 ===
string(3) "291"
=== val=0.1 ===
string(3) "0.1"
=== val=1.23 ===
string(4) "1.23"
=== val=false ===
string(0) ""
=== val=true ===
string(1) "1"
=== val='0' ===
string(1) "0"
=== val='00' ===
string(2) "00"
=== val='123' ===
string(3) "123"
=== val='0123' ===
string(4) "0123"
=== val='0x123' ===
string(5) "0x123"
=== val='hello' ===
string(5) "hello"
=== val=NULL ===
to_string(): Return value must be of type string, null returned
#0 /home/hhelibex/blog/2022-0617-01/Main.php(45): to_string()
#1 {main}
string(0) ""
=== val=Hoge::__set_state(array(
'val' => 123456789,
)) ===
to_string(): Return value must be of type string, Hoge returned
#0 /home/hhelibex/blog/2022-0617-01/Main.php(46): to_string()
#1 {main}
string(0) ""
=== val=MyInteger::__set_state(array(
'val' => 123456789,
)) ===
string(9) "123456789"
$
予想通り、__toString() を実装しておくと、objectをstringに変換してくれる。
しかし、「false」「true」が「""」「"1"」に変換されるのには未だに慣れない。