Dieser Artikel stellt Ihnen den gültigen Deklarationsbereich vor (strict_types=1). Ich hoffe, dass er Freunden in Not hilfreich sein wird!
Über den gültigen Bereich von „declare(strict_types=1)“
declare(strict_type=1); ist die angegebene Syntax des in PHP7 eingeführten strikten Typprüfungsmodus
Single Wo soll strict_types
in die Datei geschrieben werden
Grundlegende Syntax
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
var_dump(add(1.0, 2.0));
Nach dem Login kopieren
Bei unabhängiger Ausführung in diesem Zustand wird int(3)< ausgegeben /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));
Nach dem Login kopieren
在此状态下执行独立时,输出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
Nach dem Login kopieren
有TypeError
产生,如下
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
declare(strict_types=1);
var_dump(add(1.0, 2.0));
Nach dem Login kopieren
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
Nach dem Login kopieren
产生如下错误
<?php
declare(strict_types=1) {
//...
}
Nach dem Login kopieren
Fatal error
产生,这甚至不是Throwable
,而是编译过程中产生的错误
同样,与上述例子相似的位置,也不能使用如下语法
PHP Fatal error: strict_types declaration must not use block mode in
/Users/hiraku/sandbox/stricttypes/A.php on line 2
Nach dem Login kopieren
A.php脚本
<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
return $a + $b;
}
Nach dem Login kopieren
两个文件时strict_types
如何产生作用
如下代码
A.php
脚本在开头声明严格模式
B.php脚本
<?php
require 'A.php';
var_dump(add(1.0, 2.0)); //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int
Nach dem Login kopieren
A.php
被B.php
文件require
,如下
$ php B.php
int(3)
Nach dem Login kopieren
执行结果
A.php
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
什么!!!!居然能够执行而不报错!!!!!
原来是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.php
被B.php
引用了,就对A.php
使用严格模式
B.php
<?php
declare(strict_types=1);
require 'A.php';
var_dump(add(1.0, 2.0));
Nach dem Login kopieren
$ 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
Nach dem Login kopieren
C.php
<?php
require_once 'B.php';
var_dump(add(1.0, 2.0));
var_dump(add2(1.0, 2.0));
Nach dem Login kopieren
三个文件时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 'A.php';
function add2($a, $b)
{
return add($a, $b);
}
Nach dem Login kopieren
A.php
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
$ 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
Nach dem Login kopieren
执行结果如下
C.php
<?php
declare(strict_types=1); //主体部分声明
require_once 'B.php';
var_dump(add2(1.0, 2.0));
Nach dem Login kopieren
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 'A.php';
function add2($a, $b)
{
return add($a, $b);
}
Nach dem Login kopieren
A.php
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
$ php C.php
int(3)
Nach dem Login kopieren
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(); // 执行严格模式
}
}
Nach dem Login kopieren
- C.php中使用strict_types=1,因此add2(1.0,2.0)以严格模式执行,但是由于没有声明变量,所以没有任何效果
- 另一方面,具有add2()定义的B.php处于非严格模式
总结
只有在写declare
的文件的执行部分才会执行严格模式,该文件中调用的其它函数(其它文件中的函数)也会被影响
也就是说,哪个文件写了declare
Was wir bereitstellen, ist der Typ double
, aber php7
kann damit sehr gut umgehen und unterscheidet sich nicht vom Typ php5 code> era
Die folgenden Änderungen wurden vorgenommen
Bar.php
<?php
// 这个文件strict无效
class Bar
{
private $moo;
public function __construct()
{
$this->moo = new Moo; // 执行非严格模式
}
public function aaa()
{
$this->moo->aaa(); // 执行非严格模式
}
}
Nach dem Login kopieren
Ein TypeError
ist wie folgt aufgetreten
rrreee
strict_types
kann nicht in geschrieben werden Mitte des Skripts
declare-Syntax kann nicht in die Mitte des Skripts geschrieben werden. Die folgende Schreibweise ist falsch
rrreee
Der folgende Fehler wird generiert🎜rrreee
Schwerwiegender Fehler
generiert, der nicht einmal auslösbar
ist, sondern ein Fehler, der während des Kompilierungsprozesses generiert wird🎜
Ebenso kann die folgende Syntax nicht an ähnlichen Positionen verwendet werden die obigen Beispiele🎜rrreeerrree
Wie wäre es mit strict_types
, wenn es zwei Dateien gibt? Es funktioniert
🎜Der folgende Code🎜🎜
A.php
Das Skript deklariert zu Beginn den strikten Modus🎜rrreee
A.php
ist B.php Datei require
, wie folgt🎜rrreeeDas Ausführungsergebnis🎜rrreee
🎜Was!!!! Es kann ohne Fehler ausgeführt werden!!!!!!🎜
Es stellt sich heraus, dass B.php
nicht deklariert strict_types
, also ist es für B-Skript der standardmäßige lose Modus🎜
Mit anderen Worten, für strict_types gilt das folgende Verhalten🎜
- Egal Was, das Verhalten wird sich im strikten Modus nicht unterscheiden, wenn die Funktion definiert wird
- 🎜Wenn die Funktion ausgeführt wird Ja, es wird Unterschiede im strikten Modus geben 🎜
-
declare(strict_types=1);
Die Syntax selbst wird in der Datei A.php
und der Datei B.php
vervollständigt code>require und B.php
definieren keinen strengen Modus. Führen Sie dann require
aus. Die Datei (B.php
) wird ausgeführt nicht zum strikten Modus werden
Die obige Erklärung ist wie im folgenden Code dargestellt. Theoretisch wurde der strikte Modus der Codedatei A.php deaktiviert. aber nur in der Datei <code>B.php
ist declare(strict_types=1);
festgelegt, auch wenn der A.php
Strict-Modus nicht festgelegt ist, aber A.php
wird von B.php
referenziert, also verwenden Sie den strikten Modus für A.php
🎜rrreeerrreeerrreee
Die Rolle von declare(strict_types=1);
, wenn drei Dateien vorhanden sind
Verwenden Sie declare(strict_types=1);
im Funktionsdefinitionsteil >
Fügen Sie eine weitere Anforderung hinzu und versuchen Sie, 3 Dateien zu verschachteln🎜🎜C.php → B.php → A.phprrreeerrreeerrreee
Die Ausführungsergebnisse sind wie folgt🎜rrreee
var_dump( add(1.0, 2.0));
Kann korrekt ausgeführt werden-
var_dump(add2(1.0, 2.0));
Produziert TypeError
Mit anderen Worten: declare(strict_types=1);
ändert sich wie folgt🎜
- Die Datei, die die Funktion selbst definiert, hat keine Auswirkung
Rufen Sie andere Funktionen in der definierten Funktion auf. Der strikte Modus kann Auswirkungen haben (B.php
verwendet strict_types=1
und B .php
-Aufrufe). A.php
, damit A.php
funktionieren kann)
im Körperteil strict_types angegeben
Do Geben Sie strict_types nicht in der Mitte von B.php an, sondern im Hauptteil, C.php. Ist der strikte Modus für alle gültig? Tatsächlich ist der strikte Modus nur dort gültig, wo er in C.php angegeben ist B.php → A.phprrreeerrreeerrreeerrreee
- strict_types=1 wird in C.php verwendet, daher wird add2(1.0,2.0) im strikten Modus ausgeführt, aber da keine Variablen deklariert sind, ist dies auch der Fall keine Auswirkung
- Andererseits befindet sich B.php mit add2()-Definition im nicht-strikten Modus
Zusammenfassung
Nur beim Schreiben declare
führt den strikten Modus aus. Andere in der Datei aufgerufene Funktionen (Funktionen in anderen Dateien) sind ebenfalls betroffen🎜
Mit anderen Worten, welche Datei schreibt deklarieren
, alle Codes in einer Datei müssen überprüft werden, auch wenn der darin enthaltene Code aus anderen Dateien stammt, und gleichzeitig wird die zu überprüfende Datei auch von anderen Dateien aufgerufen ändert nichts an der Tatsache, dass die Datei überprüft werden muss🎜rrreeerrreee 🎜🎜Lernempfehlung: „🎜PHP Video Tutorial🎜“🎜
Das obige ist der detaillierte Inhalt vonLassen Sie uns über den gültigen Bereich von „declare(strict_types=1)' sprechen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!