Mari kita bincangkan tentang julat pengisytiharan yang sah(strict_types=1)

藏色散人
Lepaskan: 2023-04-10 21:28:01
ke hadapan
6931 orang telah melayarinya

Artikel ini akan memperkenalkan kepada anda julat pengisytiharan yang sah(strict_types=1).

Mengenai julat declare(strict_types=1) yang sah

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));
Salin selepas log masuk

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));
Salin selepas log masuk

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
Salin selepas log masuk

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));
Salin selepas log masuk

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
Salin selepas log masuk

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) {
  //...
}
Salin selepas log masuk
PHP Fatal error:  strict_types declaration must not use block mode in 
/Users/hiraku/sandbox/stricttypes/A.php on line 2
Salin selepas log masuk

Bagaimanakah strict_types berfungsi apabila terdapat dua fail?

Kod berikut

A.phpSkrip mengisytiharkan mod ketat pada permulaan

A.php脚本

<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
    return $a + $b;
}
Salin selepas log masuk

A.php dan ialah B.phpfailrequire, seperti berikut

B.php脚本

<?php
require &#39;A.php&#39;;
var_dump(add(1.0, 2.0));    //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int
Salin selepas log masuk

Hasil pelaksanaan

$ php B.php
int(3)
Salin selepas log masuk

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 fail A.php dan dilengkapkan oleh B.phpfailrequire dan B.php tidak mentakrifkan mod ketat, kemudian fail (require) yang melaksanakan B.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;
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
B.php

<?php
declare(strict_types=1);

require &#39;A.php&#39;;
var_dump(add(1.0, 2.0));
Salin selepas log masuk
Peranan
$ 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
Salin selepas log masuk
apabila terdapat tiga fail

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 &#39;B.php&#39;;
var_dump(add(1.0, 2.0));
var_dump(add2(1.0, 2.0));
Salin selepas log masuk
B.php

<?php
declare(strict_types=1);    //在函数定义部分声明
require_once &#39;A.php&#39;;
function add2($a, $b)
{
    return add($a, $b);
}
Salin selepas log masuk
Hasil pelaksanaan adalah seperti berikut
A.php

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

$ 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
Salin selepas log masuk
    boleh dilaksanakan dengan betul
  • var_dump(add(1.0, 2.0));
  • dan ralat TypeError berlaku
  • var_dump(add2(1.0, 2.0));
  • Dengan kata lain,
akan berubah seperti berikut

declare(strict_types=1);

Fail yang mentakrifkan fungsi itu sendiri tidak akan mempunyai sebarang kesan
  • Panggil fungsi lain dalam fungsi yang ditentukan, mod ketat boleh mempunyai kesan (
  • menggunakan
  • , dan pada masa yang samaB.phpstrict_types=1 dipanggil, jadi B.php boleh berfungsi)A.phpA.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 &#39;B.php&#39;;
var_dump(add2(1.0, 2.0));
Salin selepas log masuk
B.php

<?php
require_once &#39;A.php&#39;;
function add2($a, $b)
{
    return add($a, $b);
}
Salin selepas log masuk
A.php

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
$ php C.php 
int(3)
Salin selepas log masuk
strict_types=1 digunakan dalam C.php, jadi add2(1.0,2.0) dilaksanakan dalam mod ketat, tetapi kerana tiada pembolehubah diisytiharkan, ia tidak mempunyai effect
  • 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 terjejas

declare Dalam erti kata lain, fail mana yang ditulis

, semua kod di dalamnya fail perlu disemak, walaupun terdapat Kod itu datang dari fail lain Pada masa yang sama, walaupun fail yang perlu disemak juga dipanggil oleh fail lain, ia tidak mengubah fakta bahawa fail itu perlu. diperiksa

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(); // 执行严格模式
    }
}
Salin selepas log masuk
Bar.php

<?php
// 这个文件strict无效
class Bar
{
    private $moo;

    public function __construct()
    {
        $this->moo = new Moo; // 执行非严格模式
    }

    public function aaa()
    {
        $this->moo->aaa(); // 执行非严格模式
    }
}
Salin selepas log masuk
Disyorkan kajian: "
Tutorial video PHP

Atas ialah kandungan terperinci Mari kita bincangkan tentang julat pengisytiharan yang sah(strict_types=1). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan