我在PHP7中看到了这个新行,但没有人真正解释它的含义。我用谷歌搜索了它,所有他们谈论的是你是否会启用它或者不像民意调查那样。
declare(strict_types = 1);
它做什么?它如何影响我的代码?我应该这样做吗?一些解释会很好。
答案 0 :(得分:64)
使用PHP 7,我们现在添加了标量类型。具体来说:int,float, string和bool。
通过添加标量类型提示并启用严格要求,它是 希望更正确和自我记录的PHP程序可以 书面。它还可以让您更好地控制代码并实现代码 代码更容易阅读。
默认情况下,标量类型声明是非严格的,这意味着它们 将尝试更改原始类型以匹配指定的类型 通过类型声明。换句话说,如果你传递一个字符串 从一个数字开始到一个需要浮点数的函数,它会 从头开始抓取数字并删除其他所有内容。通过 浮点函数需要一个int将成为int(1)。
默认情况下,如果可能,PHP会将错误类型的值转换为预期的标量类型。例如,为需要字符串的参数赋予整数的函数将获得string类型的变量。
禁用严格类型(eval):
<?php
function AddIntAndFloat(int $a, float $b) : int
{
return $a + $b;
}
echo AddIntAndFloat(1.4,'2');
/*
* without strict typing, php will change float(1.4) to int(1)
* and string('2') to float(2.0) and returns int(3)
*/
可以基于每个文件启用严格模式。在严格模式下,只接受类型声明的确切类型的变量,否则将抛出TypeError。此规则的唯一例外是可以为期望浮点的函数赋予整数。内部函数内的函数调用不受strict_types声明的影响。
要启用严格模式,declare语句与strict_types声明一起使用:
启用了严格类型(eval):
<?php declare(strict_types=1);
function AddIntAndFloat(int $a, float $b): int
{
return (string) $a + $b;
}
echo AddIntAndFloat(1.4,'2');
// Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
echo AddIntAndFloat(1,'2');
// Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given
// Integers can be passed as float-points :
echo AddIntAndFloat(1,1);
// Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned
工作示例:
<?php
declare(strict_types=1);
function AddFloats(float $a, float $b) : float
{
return $a+$b;
}
$float = AddFloats(1.5,2.0); // returns 3.5
function AddFloatsReturnInt(float $a, float $b) : int
{
return (int) $a+$b;
}
$int = AddFloatsReturnInt($float,1.5); // returns 5
function Say(string $message): void // as on php 7.2
{
echo $message;
}
Say('Hello, world!'); // prints hello world
function ArrayToStdClass(array $array): stdClass
{
return (object) $array;
}
$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass
function StdClassToArray(stdClass $object): array
{
return (array) $object;
}
$array = StdClassToArray($object); // returns array
function ArrayToObject(array $array): object // as of php 7.2
{
return new ArrayObject($array);
}
function ObjectToArray(ArrayObject $object): array
{
return $object->getArrayCopy();
}
var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');
答案 1 :(得分:20)
strict_types
影响类型强制。
在严格类型之前,int $x
表示“ $x
必须具有与int相似的 值,但不一定具有int
专有名词的任何东西都会通过类型提示,包括:
242
)10.17
)1
),null
或13 Ghosts
)的字符串。现在,通过设置strict_types=1
,您告诉引擎int
必须表示“完全正确,并且仅是int适当的”。没有其他的。您有很大的保证,您将得到的只是给定的,而没有任何转换和潜在的损失。
示例:
<?php
function get_quantity(): int {
return '100 apples';
}
echo get_quantity() . PHP_EOL;
产生可能令人困惑的结果:
Notice: A non well formed numeric value encountered in /Users/bishop/tmp/pmkr-994/junk.php on line 4
100
我认为,大多数开发人员都希望int
提示表示“仅是一个int”。但这不是,意思是“像整数一样的东西”。启用严格类型会产生可能的预期和期望行为:
<?php declare(strict_types=1);
function get_quantity(): int {
return '100 apples';
}
echo get_quantity() . PHP_EOL;
收益:
Fatal error: Uncaught TypeError: Return value of get_quantity() must be of the type int, string returned in example.php:4
如果您使用类型提示,我认为这里有两节课:
strict_types=1
。strict_types
杂注。答案 2 :(得分:3)
PHP中的严格类型会影响强制类型。
通过设置'strict_types = 1',您告诉引擎“ int $ x”表示“ $ x只能是int适当的,不允许类型强制”。您有很大的保证,您将得到的只是给定的,而没有任何转换或潜在的损失。
您需要了解的有关PHP中严格类型的所有信息:)
https://medium.com/@chemaclass/strict-types-in-php-d4166bd25394