HHeLiBeXの日記 正道編

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

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