ホームページ > バックエンド開発 > PHPチュートリアル > 宣言の有効範囲について話しましょう(strict_types=1)

宣言の有効範囲について話しましょう(strict_types=1)

藏色散人
リリース: 2023-04-10 21:28:01
転載
6948 人が閲覧しました

この記事ではdeclare(strict_types=1)の有効範囲を紹介しますので、困っている友人の参考になれば幸いです!

declare(strict_types=1)の有効範囲について

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));
ログイン後にコピー

次のエラーが発生します<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">ログイン後にコピー</div></div>

致命的なエラー

が生成されます。これは

Throwable

ですらないが、コンパイル プロセス中に生成されるエラーです 同様に、次の構文は上記の例と同様の位置では使用できません<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php declare(strict_types=1) {   //... }</pre><div class="contentsignin">ログイン後にコピー</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">ログイン後にコピー</div></div>ファイルが 2 つある場合

strict_types

仕組み

次のコード

A.phpscript 先頭で strict モードを宣言する

A.php脚本

<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
    return $a + $b;
}
ログイン後にコピー

A.php

B.php

filerequire で、以下の通り <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">B.php脚本 &lt;?php require 'A.php'; var_dump(add(1.0, 2.0));    //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int</pre><div class="contentsignin">ログイン後にコピー</div></div> 実行結果 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$ php B.php int(3)</pre><div class="contentsignin">ログイン後にコピー</div></div>

なんと!!!! エラーなく実行できました!!!!!

B.phpstrict_types
を宣言していないことが判明したため、B スクリプトでは、これがデフォルトのルーズ モードです。つまり、 strict_types 次の動作があります

何があっても、関数が定義されているときの厳密モードの動作に違いはありません

  • 関数を実行するときの厳密モードでは違いがあります
  • #declare(strict_types=1); の構文自体は ## で完成します#A.php ファイル、および
  • B.php
  • filerequire、および B.php は厳密モードを定義していないため、ファイル (#require を実行する ##B.php) は、厳密モードにはなりません上記の説明は、次のコードに示されているとおりです。 A.php ファイルはオフになっていますが、B.php ファイルだけが
  • declare (strict_types=1);
を設定しており、## であっても#A.php

は厳密モードを設定しません。##A.phpB.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 .phpA.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
    が記述されている場合、そのファイル内のコードが他のファイルからのものであっても、そのファイル内のすべてのコードをチェックする必要があります。同時に、チェックする必要があるファイルが呼び出されたとしても、他のファイルによっても、チェックする必要があるファイルは変更されません。

以上が宣言の有効範囲について話しましょう(strict_types=1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート