HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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