Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 函数中的类型声明会使我的代码性能更好吗?_Php_Performance_Php 7 - Fatal编程技术网

Php 函数中的类型声明会使我的代码性能更好吗?

Php 函数中的类型声明会使我的代码性能更好吗?,php,performance,php-7,Php,Performance,Php 7,PHP7正在慢慢展开,人们开始使用它,我也是 PHP7中的一个新特性是,您可以为输入和结果声明类型 例如,一个输入必须是字符串,一个输入必须是int,结果将是布尔值: // PHP <7 function foo($example, $someNumber) {} // PHP 7 function foo(string $example, int $someNumber): bool{} //PHP归根结底,在添加类型声明时,性能不应该是您关心的问题。它们的存在是为了简化程序员的工作,

PHP7正在慢慢展开,人们开始使用它,我也是

PHP7中的一个新特性是,您可以为输入和结果声明类型

例如,一个输入必须是字符串,一个输入必须是int,结果将是布尔值:

// PHP <7
function foo($example, $someNumber) {}
// PHP 7
function foo(string $example, int $someNumber): bool{}

//PHP归根结底,在添加类型声明时,性能不应该是您关心的问题。它们的存在是为了简化程序员的工作,而不是解释器的工作。如果你认为它们对你有帮助,就使用它们。是否使用类型声明不太可能是代码性能的主要决定因素

话虽如此,目前(PHP7.0)在使用类型声明时实际上会有一点性能损失,因为PHP现在必须检查传入和传出函数的值的类型。完全不检查会更快,这是在没有类型声明时发生的情况

然而,情况比这更微妙,而且正在发生变化

严格的类型强制您传递正确的类型 如果使用严格类型,则必须传递理想类型的值(例如int),而不能传递其他类型(例如string)并让PHP为您转换。传递正确的类型比让PHP从其他类型转换要快:类型转换需要时间

类型声明可以避免重复的类型转换 如果使用类型声明,无论是否使用严格类型,通常都会避免对同一个值进行重复的类型转换

通常,如果您有一个执行多个数字操作的函数,并且您传入了一个字符串参数,那么每次PHP对其执行操作时,都必须将其转换为适当的数字类型(int或float)

但是,如果您对该参数有一个类型声明,那么它只会被转换一次,要么是自动转换(弱类型模式),要么是因为您自己显式地转换了它

类型声明使PHP能够省略类型检查 类型声明为PHP运行时提供了保证,它有时可以使用这些保证来避免必须进行的类型检查。例如,以以下代码行为例:

$a = $b * $c;
如果没有类型声明,PHP首先必须对
$b
$c
进行内部类型检查,然后才能将它们相乘;PHP需要确保它们都是数字类型,如果不是,则进行转换,然后执行适当类型的乘法(
int
×
int
float
×
int
),等等)

但是如果您事先声明了
$b
$c
的类型,那么PHP不需要在这里检查它们,并且可以立即执行实际的乘法。那更快。如果在函数中使用这些变量执行多个操作,则尤其如此

当使用OPcache时,该优化在PHP7.1中实现

也可以实现类似的优化,以消除参数和返回值类型检查。例如,如果一个函数声明一个参数是int,那么如果它将该参数传递给另一个同样需要int的函数,则无需再次检查其类型。PHP7.1当前可以删除一些不必要的返回类型检查(在使用OPcache时可以删除更多),但不需要检查参数类型


由于这些类型的优化,带有类型声明的代码的性能损失越来越小,而且将来带有类型声明的代码比没有类型声明的代码的速度要快得多。

类型提示的很大一部分是对程序员的帮助。使用正确的工具(智能IDE、静态类型检查器),您可以在代码运行之前避免所有类的错误。由于PHP通常不会提前编译,因此性能改进可能不会像静态编译器那样多。PHP 7.1可以删除一些返回类型检查,但参数检查目前没有被省略。关于“使用OPcache时,此优化在PHP 7.1中实现”,你有没有这方面的资料来源,或者你是通过C代码找到的?如果我正确理解了您的答案,在PHP7.1中,使用OPCache可以降低性能损失,但与不使用类型声明的代码相比,这仍然是一个总体损失。你知道PHP7.2的情况是否也一样吗?@rink.attendant.6在PHP内部邮件列表IIRC上,Dmitry Stogov写了一些关于它的文章,但我不确定如何找到它。