2017-01-04 9 views
8

declare(strict_types=1);が有効になっていると、PHP 7.0.11で本当に面白いバグを見つけました。array_map()でもarray_walk()でも厳密な型ヒントが認識されません。厳密な型を有効にすることで、PHPはコア関数で厳密な型ヒントを使用していますが、そうではありません。 この例のコードを見て、それは例外TypeError例外をスローする必要があります厳密な型ヒントを有効にすると、array_mapは型をとにかく変換​​します

declare(strict_types=1); 

$myArray = [12, 'string value', 'another string value', 5]; 

array_map('validateMyArrayValues', $myArray); 

function validateMyArrayValues(string $item) 
{ 
    var_dump($item); 
} 

var_dump結果は次のとおりです。

test.php:13: 
    string(2) "12" 
test.php:13: 
    string(12) "string value" 
test.php:13: 
    string(20) "another string value" 
test.php:13: 
    string(1) "5" 

すべての整数値は明らかに問題である文字列に型変換されています。これは、私が一緒にdeclare(strict_types=1);を落とすと、is_*の機能と投げ例外を使用して質問を提起する?

+0

*厳密な型が必要な場合は、PHPを使用しないでください。その利点の1つはその緩いタイプです –

+0

@ raina77owはい、はいそれはちょっと変わったbheaviourです。不思議なことにintで正しく動作します。実際には、誰かがバグレポートをPHP devグループに投稿できるのであれば、PHP 7.1も影響を受けるので本当にうれしいです。私は適切なバグレポートを作成するのが得意ではありません。 –

+0

@Dagon rightしかし、すべてのプログラミング言語には長所と短所があります。 –

答えて

5

それはここでStrict Types RFCだバグ(正しい方向に私を指しているためRoom 11に帽子の先端)

ではありません。 PHPの歴史の中で、本当に、本当に長く、最も重大なRFCです(そして、私は深刻です)。ここでは、関連する部分があなたのために

を切り取っています。この提案は、内部およびユーザー機能のために、(同じルールを使用して)、デフォルトでは、弱い型チェックで構築します。

-

をPHPコミュニティの重要な部分は、完全に厳密なタイプを好むように見えます。しかし、厳密に型チェックされたスカラー型宣言を追加すると、いくつかの問題が発生します。

PHPの弱い型指定を利用していた既存のコードは、呼び出される関数がスカラー型の宣言をパラメータに追加した場合に破損します。これは、既存のコードベース、特にライブラリの関数のパラメータへのスカラー型宣言の追加を複雑にします。

これはバグではありません。これはこれを可能にした偉大な妥協の一部でした(あなたが望むならば、より厳しいタイピングに向けての赤ちゃんの歩み)。関数は厳密な型指定を無視します。はい、それは他の言語とは矛盾しています(RFCの詳細については注意してください)が、これはPHPコミュニティが今のところそれを決定した方法です。

+0

はい、弱いタイプのヒント([デモ](https://eval.in/709627))。どの整数も文字列に変換できますが、 '数値'文字列のみが整数に変換されます。 – raina77ow

+0

これはビッグ・アハの瞬間です。 @Machavityの説明をありがとう。私は現在Strict Types RFCを読んでいます。本当に面白いです。 –

関連する問題