PHP7とスカラー型宣言とわたくし(メモ)
問題
引数をintで宣言しているのに、intではない値で関数を呼び出せてしまうのですが・・・
(なぜ例外が発生しないの?)
結論
・PHPファイルの先頭行に
declare(strict_types=1);
を書くと厳密な型チェックが行われるので、型宣言と異なる引数で実行しようとした場合、例外が発生する。ただし、有効になるのは
それを有効にしたファイル の中からの関数呼び出しだけです。
・コード規約等で「厳密な型チェックモードで開発する」ように取り決めておく
気持ち
せめてphp.ini で設定できるようにしてくれんか
ゆるい型でスカラー型宣言する意味、ある?
前提となる話(参考)
PHPマニュアル関連ページ
PHP 型の比較表
https://www.php.net/manual/ja/types.comparisons.php
PHP 5.6.x から PHP 7.0.x への移行 (新機能)
https://www.php.net/manual/ja/migration70.new-features.php
強い型付け
https://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict
参考記事
[PHP] 型宣言(PHP7)
https://qiita.com/hikaru_/items/2c12068eafea75e51cce
declare(strict_types=1)の効力範囲について
https://qiita.com/Hiraku/items/734f0666ab3d34c52efa
お前は PHP 7 における Fatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを言えるか?
https://qiita.com/mpyw/items/c69da9589e72ceac470c
具体例
PHP 型の比較表
https://www.php.net/manual/ja/types.comparisons.php
PHP 5.6.x から PHP 7.0.x への移行 (新機能)
https://www.php.net/manual/ja/migration70.new-features.php
強い型付け
https://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict
[PHP] 型宣言(PHP7)
https://qiita.com/hikaru_/items/2c12068eafea75e51cce
declare(strict_types=1)の効力範囲について
https://qiita.com/Hiraku/items/734f0666ab3d34c52efa
お前は PHP 7 における Fatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを言えるか?
https://qiita.com/mpyw/items/c69da9589e72ceac470c
以下のようなPiyoクラスがあり、hogeメソッドの第一引数はint型宣言しているので、
整数の1、2以外の引数でこのメソッドを呼び出した場合、例外が発生して欲しい気持ちです。
class Piyo{
/**
* @param int $fugaId
* @param array $data
* @return array
*/
public function hoge(int $fugaId, array $data)
{
switch ($fugaId) {
case 1:
return $this->type1($data);
break;
case 2:
return $this->type2($data);
break;
default :
throw new \InvalidArgumentException();
break;
}
}
}
以下の要領でテストを書く
class PiyoTest extends PHPUnit\Framework\TestCase{
/**
* @dataProvider hogeDataProvider
* @param $fugaId
*/
public function testHoge($fugaId){
$object = new Piyo();
$actual=$object->hoge($fugaId,[]);
try{
$this->assertTrue(is_array($actual));
}catch(\Error $e){
//本当は、型が違う場合はこっちを通ってほしい
}catch(\Exception $e){
//整数で、1、2以外の値の場合はここを通ってほしい
}
}
/**
* テストケース
*/
public function hogeDataProvider()
{
return [
[1],//当然成功してよい
[2],//当然成功してよい
[1.5],//成功してしまう
["1"],//成功してしまう
["2"],//成功してしまう
[true],//成功してしまう
];
}
}
コメント中にもある通り、1.5、"1"、TRUE、などは暗黙の型変換でintの1扱いとされるので、結果hogeメソッドは例外を発生させずに、正常に実行できてしまう。
PHPの動きとしては当然そうなんでしょうけど、非常にアレですよね
Author And Source
この問題について(PHP7とスカラー型宣言とわたくし(メモ)), 我々は、より多くの情報をここで見つけました https://qiita.com/gunso/items/cd39b4f05092c0ffa68e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .