严格类型在PHP中做什么?

严格类型在PHP中做什么?,php,php-7.2,strong-typing,weak-typing,Php,Php 7.2,Strong Typing,Weak Typing,我在PHP7中看到了以下新行,但没有人真正解释它的含义。我已经在谷歌上搜索过了,他们谈论的都是你会启用它还是不会像民意调查那样 declare(strict_types = 1); 它有什么作用?它如何影响我的代码?我应该这样做吗 一些解释会很好。来自: 在PHP7中,我们现在添加了标量类型。具体来说:int,float, 弦,还有布尔 通过添加标量类型提示并启用严格要求,它是 希望能有更多正确的、自文档化的PHP程序 书面的它还使您能够更好地控制代码,并可以 代码更容易阅读 默认情况下,标量

我在PHP7中看到了以下新行,但没有人真正解释它的含义。我已经在谷歌上搜索过了,他们谈论的都是你会启用它还是不会像民意调查那样

declare(strict_types = 1);
它有什么作用?它如何影响我的代码?我应该这样做吗

一些解释会很好。

来自:

在PHP7中,我们现在添加了标量类型。具体来说:int,float, 弦,还有布尔

通过添加标量类型提示并启用严格要求,它是 希望能有更多正确的、自文档化的PHP程序 书面的它还使您能够更好地控制代码,并可以 代码更容易阅读

默认情况下,标量类型声明是非严格的,这意味着它们 将尝试更改原始类型以匹配指定的类型 通过类型声明。换句话说,如果你传递一个字符串 从一个数字开始进入一个需要浮点数的函数,它将 从开头抓起号码,然后删除所有其他内容。经过 需要int的函数中的浮点将变为int(1)

默认情况下,如果可能,PHP会将错误类型的值强制转换为预期的标量类型。例如,为期望字符串的参数指定整数的函数将获得字符串类型的变量

严格类型已禁用():


严格类型
影响类型强制。

在不使用
严格类型的情况下使用类型提示可能会导致细微的错误。

在严格类型之前,
int$x
表示“
$x
必须具有可强制为int的值”。任何可强制为
int
的值都会传递类型提示,包括:

  • 整数本身(
    242
  • 浮点数(
    10.17
  • bool(
    true
  • null
    ,或
  • 带前导数字的字符串(
    “13重影”
通过设置
strict\u types=1
,您可以告诉引擎
int$x
意味着“$x必须是int-property,不允许类型强制”。您可以很好地保证您得到的是确切的、仅是给定的,没有任何转换和潜在损失

例如:

<?php
function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;
我认为,大多数开发人员都希望
int
提示意味着“只有一个int”。但它不是,它的意思是“任何类似int的东西”。启用strict_类型可以提供可能的预期和期望行为:

<?php declare(strict_types=1);

function get_quantity(): int {
    return '100 apples';
}
echo get_quantity() . PHP_EOL;
如果使用类型提示,我认为这里有两个教训:

  • 始终使用
    strict\u types=1
  • 将通知转换为异常,以防忘记添加
    strict\u类型
    pragma

。对于严格的指示类型,也可以看看这一点。这一点几乎在一年前就已经得到了很好的回答;)事实上,我把另一个答案投给了埃米克斯。然而,我觉得“我应该这样做”这个问题没有被提及。我还觉得,一个更简洁、更令人震惊的例子会鼓励人们使用
严格的\u类型
。我认为这个问题简洁地解决了OP问题中的“我应该这样做吗?”部分。稍作停顿后返回PHP,这非常有帮助。@Paul,我认为你错了。他做了和你说的相反的事。。。可以用(整数)代替(float)变量,但反过来不是真的,这正是他用(float)代替(int)变量所做的相反的事情,在这种情况下,错误实际上应该在到达返回类型错误之前的那一点上提高。请再次检查代码。。。实际上我也测试过了。
<?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 in 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');
<?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
<?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