declare(strict_type=1); は、 で導入された strict 型チェック モードです。 php7
指定構文
単一ファイルの場合strict_types
どこに書くべきか
基本構文
<?php function add(int $a, int $b): int { return $a + $b; } var_dump(add(1.0, 2.0));
この状態で単独実行する場合、出力int (3)
私たちが提供するのは double
型ですが、php7
はそれをうまく処理でき、php5
時間に違いはありません
#次の変更が行われました#<?php
declare(strict_types=1); //加入这句
function add(int $a, int $b): int
{
return $a + $b;
}
var_dump(add(1.0, 2.0));
#TypeError
#
PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /Users/hiraku/sandbox/stricttypes/A.php on line 9 and defined in /Users/hiraku/sandbox/stricttypes/A.php:4 Stack trace: #0 /Users/hiraku/sandbox/stricttypes/A.php(9): add(1, 2) #1 {main} thrown in /Users/hiraku/sandbox/stricttypes/A.php on line 4
strict_typesスクリプトの途中に記述することはできません
declare
構文をスクリプトの途中に記述することはできません。次の記述は間違っています##<?php function add(int $a, int $b): int { return $a + $b; } declare(strict_types=1); var_dump(add(1.0, 2.0));
次のエラーが発生します<pre class="brush:php;toolbar:false">PHP Fatal error: strict_types declaration must be the very first statement in the script in
/Users/hiraku/sandbox/stricttypes/A.php on line 7</pre>
が生成されます。これは
Throwable ですらないが、コンパイル プロセス中に生成されるエラーです 同様に、次の構文は上記の例と同様の位置では使用できません
<pre class="brush:php;toolbar:false"><?php
declare(strict_types=1) {
//...
}</pre>
<pre class="brush:php;toolbar:false">PHP Fatal error: strict_types declaration must not use block mode in
/Users/hiraku/sandbox/stricttypes/A.php on line 2</pre>
ファイルが 2 つある場合
仕組み
次のコード
A.phpscript 先頭で strict モードを宣言する
A.php脚本 <?php declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; }
A.php
は
filerequire
で、以下の通り <pre class="brush:php;toolbar:false">B.php脚本
<?php
require 'A.php';
var_dump(add(1.0, 2.0)); //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int</pre>
実行結果 <pre class="brush:php;toolbar:false">$ php B.php
int(3)</pre>
B.php が strict_types
を宣言していないことが判明したため、B スクリプトでは、これがデフォルトのルーズ モードです。つまり、
strict_types
次の動作があります
何があっても、関数が定義されているときの厳密モードの動作に違いはありません
- 関数を実行するときの厳密モードでは違いがあります
- #declare(strict_types=1); の構文自体は ## で完成します#A.php ファイル、および B.php
- file
require
、およびB.php
は厳密モードを定義していないため、ファイル (#require
を実行する ##B.php) は、厳密モードにはなりません
上記の説明は、次のコードに示されているとおりです。
A.php
ファイルはオフになっていますが、B.php
ファイルだけが declare (strict_types=1);
は厳密モードを設定しません。##A.php は
B.php によって参照されます。##A.php
# には厳密モードを使用してください。 ##
A.php <?php function add(int $a, int $b): int { return $a + $b; }
B.php <?php declare(strict_types=1); require 'A.php'; var_dump(add(1.0, 2.0));
$ php B.php PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /Users/hiraku/sandbox/stricttypes/B.php on line 4 and defined in /Users/hiraku/sandbox/stricttypes/A.php:2
ファイルが3つの場合、
declare(strict_types=1);
の役割は関数定義部分にあります
declare(strict_types=1)を使用します;
別の require を追加して 3 つのファイルをネストしてみます
C.php → B.php → A.php
C.php
<?php
require_once 'B.php';
var_dump(add(1.0, 2.0));
var_dump(add2(1.0, 2.0));
B.php
<?php
declare(strict_types=1); //在函数定义部分声明
require_once 'A.php';
function add2($a, $b)
{
return add($a, $b);
}
A.php
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
実行結果は次のとおりです
$ php C.php
int(3)
PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in
/Users/hiraku/sandbox/stricttypes/B.php
on line 7 and defined in /Users/hiraku/sandbox/stricttypes/A.php:2
##var_dump(add(1.0, 2.0)); 正常に実行可能
var_dump(add2 (1.0, 2.0));
TypeError を生成します。つまり、
declare(strict_types=1);- は次のように変更されます。
-
- 定義された関数内で他の関数を呼び出すと、厳密モードで効果を生成できます (
B.php
は strict_types= 1
B .php は
A.php
- A.php
- は機能します)
-
メイン部分で strict_types を指定します
strict_types を B.php の途中で指定するのではなく、本体の C.php で指定してください。 C.php → B.php → A.php
C.php <?php declare(strict_types=1); //主体部分声明 require_once 'B.php'; var_dump(add2(1.0, 2.0));
B.php <?php require_once 'A.php'; function add2($a, $b) { return add($a, $b); }
A.php <?php function add(int $a, int $b): int { return $a + $b; }
$ php C.php int(3)
strict_types=1 が C.php で使用されているため、add2(1.0,2.0) は strict モードで実行されますが、変数が宣言されていないため、 、効果はありません。
一方、add2() 定義を含む B.php は非厳密モードです。
概要
厳密モードのみが効果を発揮します。ファイルの
declareが書かれた実行部分でのみ実行されます。ファイル内で呼び出される他の関数 (他のファイル内の関数) も影響を受けます。
つまり、どのファイルdeclare
- が記述されている場合、そのファイル内のコードが他のファイルからのものであっても、そのファイル内のすべてのコードをチェックする必要があります。同時に、チェックする必要があるファイルが呼び出されたとしても、他のファイルによっても、チェックする必要があるファイルは変更されません。