Parlons de la plage valide de declare(strict_types=1)

藏色散人
Libérer: 2023-04-10 21:28:01
avant
6937 Les gens l'ont consulté

Cet article vous présentera la plage valide de declare(strict_types=1). J'espère qu'il sera utile aux amis dans le besoin !

À propos de la plage valide de declare(strict_types=1)

declare(strict_type=1); est la syntaxe spécifiée du mode de vérification de type strict introduit dans php7

Single Où les strict_types doivent-ils être écrits dans le fichier

Syntaxe de base

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

var_dump(add(1.0, 2.0));
Copier après la connexion

Lors de l'exécution indépendante dans cet état, affichez int(3)< /code ><code>严格类型检查模式的指定语法

单个文件时strict_types应写在哪里

基本语法

<?php
declare(strict_types=1);    //加入这句

function add(int $a, int $b): int
{
    return $a + $b;
}

var_dump(add(1.0, 2.0));
Copier après la connexion

在此状态下执行独立时,输出int(3)

我们提供的是double类型,但php7能很好的处理它,和php5时代没什么区别

做了如下变更

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
Copier après la connexion

TypeError产生,如下

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

declare(strict_types=1);

var_dump(add(1.0, 2.0));
Copier après la connexion

strict_types不能写在脚本中间

declare语法不能写在脚本的中间,如下写法是错误的

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
Copier après la connexion

产生如下错误

<?php
declare(strict_types=1) {
  //...
}
Copier après la connexion

Fatal error产生,这甚至不是Throwable,而是编译过程中产生的错误

同样,与上述例子相似的位置,也不能使用如下语法

PHP Fatal error:  strict_types declaration must not use block mode in 
/Users/hiraku/sandbox/stricttypes/A.php on line 2
Copier après la connexion
A.php脚本

<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
    return $a + $b;
}
Copier après la connexion

两个文件时strict_types如何产生作用

如下代码

A.php脚本在开头声明严格模式

B.php脚本

<?php
require &#39;A.php&#39;;
var_dump(add(1.0, 2.0));    //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int
Copier après la connexion

A.phpB.php文件require,如下

$ php B.php
int(3)
Copier après la connexion

执行结果

A.php

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion

什么!!!!居然能够执行而不报错!!!!!
原来是B.php并没有声明strict_types,所以对于B脚本来说,是默认的松散模式

也就是说,对于strict_types有以下的行为

  • 不管怎么样,函数定义时的严格模式,行为并不会出现什么不同
  • 函数执行时的,严格模式会出现差异
  • declare(strict_types=1);的语法本身在A.php文件中完成,而被B.php文件require,而B.php并没有定义严格模式,那么执行require的文件(B.php)不会变成严格模式

上述解释就如如下代码所示,理论上A.php文件的严格模式已经关闭了,然而仅仅是B.php文件设定了declare(strict_types=1);,那么即使A.php没有设定严格模式,但A.phpB.php引用了,就对A.php使用严格模式

B.php

<?php
declare(strict_types=1);

require &#39;A.php&#39;;
var_dump(add(1.0, 2.0));
Copier après la connexion
$ 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
Copier après la connexion
C.php

<?php
require_once &#39;B.php&#39;;
var_dump(add(1.0, 2.0));
var_dump(add2(1.0, 2.0));
Copier après la connexion

三个文件时declare(strict_types=1);的作用

在函数定义部分使用declare(strict_types=1);

再增加一个require,试试3个文件嵌套

C.php → B.php → A.php
B.php

<?php
declare(strict_types=1);    //在函数定义部分声明
require_once &#39;A.php&#39;;
function add2($a, $b)
{
    return add($a, $b);
}
Copier après la connexion
A.php

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
$ 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
Copier après la connexion

执行结果如下

C.php

<?php
declare(strict_types=1);    //主体部分声明
require_once &#39;B.php&#39;;
var_dump(add2(1.0, 2.0));
Copier après la connexion
  • 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

不在B.php中途位置指定strict_types,而在主要部分即C.php指定,strict模式对所有的都有效吗?然而,事实上strict模式只有在引用的地方有效

C.php → B.php → A.php
B.php

<?php
require_once &#39;A.php&#39;;
function add2($a, $b)
{
    return add($a, $b);
}
Copier après la connexion
A.php

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
$ php C.php 
int(3)
Copier après la connexion
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(); // 执行严格模式
    }
}
Copier après la connexion
  • C.php中使用strict_types=1,因此add2(1.0,2.0)以严格模式执行,但是由于没有声明变量,所以没有任何效果
  • 另一方面,具有add2()定义的B.php处于非严格模式

总结

只有在写declare的文件的执行部分才会执行严格模式,该文件中调用的其它函数(其它文件中的函数)也会被影响

也就是说,哪个文件写了declare

Ce que nous fournissons est le type double, mais php7 peut très bien le gérer, et ce n'est pas différent du php5 code> era

Les modifications suivantes ont été apportées

Une TypeError s'est produite, comme suit

rrreee

strict_types ne peut pas être écrit dans le milieu du script

declare ne peut pas être écrite au milieu du script L'écriture suivante est fausse

rrreee

L'erreur suivante est générée🎜rrreee

Une erreur fatale est générée, qui n'est même pas Throwable, mais une erreur générée pendant le processus de compilation🎜

De même, la syntaxe suivante ne peut pas être utilisée dans des positions similaires à les exemples ci-dessus🎜rrreeerrree

Que diriez-vous des strict_types quand il y a deux fichiers Cela fonctionne

🎜Le code suivant🎜🎜

A.phpLe script déclare le mode strict au début🎜rrreee

A.php est le fichier B.php require, comme suit🎜rrreeeLe résultat de l'exécution🎜rrreee

🎜Quoi!!!! Il peut être exécuté sans erreur !!!!!!🎜
Il s'avère que B.php ne déclare pas strict_types, donc pour le script B, c'est le mode lâche par défaut🎜

En d'autres termes, pour strict_types a le comportement suivant🎜

  • Peu importe quoi, le comportement ne sera pas différent en mode strict lorsque la fonction est définie
  • 🎜Lorsque la fonction est exécutée Oui, il y aura des différences en mode strict 🎜
  • declare(strict_types=1); La syntaxe elle-même est complétée dans le fichier A.php et dans le fichier B.php require, et B.php ne définit pas le mode strict, alors exécutez require Le fichier (B.php) ne devient pas en mode strict

L'explication ci-dessus est celle indiquée dans le code suivant En théorie, le fichier A.php Le mode strict du code> a été désactivé, mais seul le fichier <code>B.php a défini declare(strict_types=1);, alors même si le mode A.php Strict n'est pas défini, mais A.php est référencé par B.php, utilisez donc le mode strict pour A.php 🎜rrreeerrreeerrreee

Le rôle de declare(strict_types=1); lorsqu'il y a trois fichiers

Utilisez declare(strict_types=1);

Ajoutez un autre require et essayez d'imbriquer 3 fichiers🎜🎜C.php → B.php → A.phprrreeerrreeerrreee

Les résultats de l'exécution sont les suivants🎜rrreee

    var_dump(add(1.0, 2.0) Peut être exécuté correctement
  • var_dump(add2(1.0, 2.0));Produit TypeError

En d'autres termes , declare(strict_types=1); changera comme suit🎜

  • Le fichier qui définit la fonction elle-même ne produira aucun effet
  • Appelez d'autres fonctions dans le fonction définie, le mode strict peut produire des effets (B.php utilise strict_types=1 et B .php appelle A.php, donc <code>A.php peut fonctionner)

spécifié dans la partie du corps strict_types

Ne spécifiez pas strict_types au milieu de B.php, mais précisez-le dans la partie principale, C.php Le mode strict est-il valable pour tous ? Cependant, en fait, le mode strict n'est valable que là où il est cité🎜🎜 C.php → B.php → A.php. rrreeerrreeerrreeerrreee

  • strict_types=1 est utilisé en C.php, donc add2(1.0,2.0) est exécuté en mode strict, mais comme aucune variable n'est déclarée, cela n'a aucun effet
  • Par contre, B.php avec la définition add2() est en mode non strict

Résumé

Uniquement lors de l'écriture declare

exécutera le mode strict. Les autres fonctions appelées dans le fichier (fonctions dans d'autres fichiers) seront également affectées🎜

En d'autres termes, quel fichier écrit declare, tous les codes d'un fichier doivent être vérifiés, même si le code qu'il contient provient d'autres fichiers, et en même temps, même si le fichier qui doit être vérifié est également appelé par d'autres fichiers, cela ne change rien au fait que le le fichier doit être vérifié🎜rrreeerrreee 🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo PHP🎜"🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal