型宣言~string~
型宣言の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"」に変換されるのには未だに慣れない。