declare(strict_type=1); ialah sintaks yang ditetapkan bagi 严格类型检查模式
yang diperkenalkan dalam php7
Di mana harus strict_types
ditulis dalam satu fail
Sintaks asas
<?php function add(int $a, int $b): int { return $a + $b; } var_dump(add(1.0, 2.0));
Apabila melaksanakan secara bebas dalam keadaan ini, outputint(3)
kami Apa yang disediakan adalah jenis double
, tetapi php7
boleh mengendalikannya dengan baik, dan tidak berbeza dengan era php5
telah membuat perubahan berikut
<?php declare(strict_types=1); //加入这句 function add(int $a, int $b): int { return $a + $b; } var_dump(add(1.0, 2.0));
Terdapat TypeError
yang dihasilkan, seperti berikut
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
tidak boleh ditulis di tengah-tengah skrip
declare
sintaks tidak boleh ditulis di tengah-tengah skrip, tulisan berikut salah
<?php function add(int $a, int $b): int { return $a + $b; } declare(strict_types=1); var_dump(add(1.0, 2.0));
menghasilkan ralat berikut
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
Fatal error
menghasilkan, ini bukan Throwable
, tetapi ralat dihasilkan semasa penyusunan
Sekali lagi, serupa dengan kedudukan contoh di atas, anda juga tidak boleh menggunakan sintaks berikut
<?php declare(strict_types=1) { //... }
PHP Fatal error: strict_types declaration must not use block mode in /Users/hiraku/sandbox/stricttypes/A.php on line 2
Bagaimanakah strict_types
berfungsi apabila terdapat dua fail?
Kod berikut
A.php
Skrip mengisytiharkan mod ketat pada permulaan
A.php脚本 <?php declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; }
A.php
dan ialah B.php
failrequire
, seperti berikut
B.php脚本 <?php require 'A.php'; var_dump(add(1.0, 2.0)); //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int
Hasil pelaksanaan
$ php B.php int(3)
Apa!!!! Ia boleh dilaksanakan tanpa ralat!!!!
Ternyata B.php
tidak mengisytiharkan strict_types
, jadi untuk skrip B, ia adalah mod longgar lalai
Dengan kata lain, untuk strict_types
terdapat kelakuan berikut
- Tidak kira apa pun, tingkah laku tidak akan berbeza dalam mod ketat apabila fungsi ditakrifkan
- Perbezaan akan berlaku dalam mod ketat apabila fungsi dilaksanakan
declare(strict_types=1);
Sintaks itu sendiri dilengkapkan dalam failA.php
dan dilengkapkan olehB.php
failrequire
danB.php
tidak mentakrifkan mod ketat, kemudian fail (require
) yang melaksanakanB.php
tidak akan menjadi mod ketat
Penjelasan di atas adalah seperti yang ditunjukkan dalam kod berikut, teori Mod ketat fail A.php
telah dimatikan, tetapi hanya B.php
fail telah menetapkan declare(strict_types=1);
Jadi walaupun A.php
tidak menetapkan mod ketat, tetapi A.php
dirujuk oleh B.php
, ia akan menjadi betul 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
declare(strict_types=1);
Gunakan
declare(strict_types=1);
dalam bahagian definisi fungsi Tambah keperluan lain dan cuba bersarang 3 fail
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
- boleh dilaksanakan dengan betul
var_dump(add(1.0, 2.0));
dan ralat TypeError berlakuvar_dump(add2(1.0, 2.0));
Dengan kata lain,
declare(strict_types=1);
- Panggil fungsi lain dalam fungsi yang ditentukan, mod ketat boleh mempunyai kesan ( menggunakan
- , dan pada masa yang sama
B.php
strict_types=1
dipanggil, jadiB.php
boleh berfungsi)A.php
A.php
Nyatakan strict_types di bahagian utama
Jangan nyatakan strict_types di tengah B.php, tetapi di bahagian bahagian utama, iaitu C.php tentukan, adakah mod ketat sah untuk semua? Namun, sebenarnya, mod ketat hanya sah jika dipetik
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)
- Sebaliknya, B.php dengan definisi add2() berada dalam mod tidak ketat Ringkasan
Mod ketat hanya akan dilaksanakan dalam bahagian pelaksanaan fail di mana
ditulis , fungsi lain yang dipanggil dalam fail ini (fungsi dalam fail lain) juga akan terjejasdeclare
Dalam erti kata lain, fail mana yang ditulis
declare
Foo.php <?php // 这个文件的strict有效 declare(strict_types=1); class Foo { private $bar; public function __construct() { $this->bar = new Bar; // 执行严格模式 } public function aaa() { $this->bar->aaa(); // 执行严格模式 } }
Bar.php <?php // 这个文件strict无效 class Bar { private $moo; public function __construct() { $this->moo = new Moo; // 执行非严格模式 } public function aaa() { $this->moo->aaa(); // 执行非严格模式 } }