Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang julat pengisytiharan yang sah(strict_types=1)

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

藏色散人
藏色散人ke hadapan
2022-01-30 04:00:326935semak imbas

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));

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.phpSkrip 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.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

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 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;
}
B.php

<?php
declare(strict_types=1);

require &#39;A.php&#39;;
var_dump(add(1.0, 2.0));
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
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));
B.php

<?php
declare(strict_types=1);    //在函数定义部分声明
require_once &#39;A.php&#39;;
function add2($a, $b)
{
    return add($a, $b);
}
Hasil pelaksanaan adalah seperti berikut
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 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));
B.php

<?php
require_once &#39;A.php&#39;;
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 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(); // 执行严格模式
    }
}
Bar.php

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

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

    public function aaa()
    {
        $this->moo->aaa(); // 执行非严格模式
    }
}
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!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam