函数中的类型声明会使我的代码表现更好吗?

时间:2016-07-11 13:36:05

标签: php performance php-7

PHP 7正在慢慢展开,人们开始使用它,我也是。

PHP7的一个新功能是,您可以give functions a type declaration获取输入,并获得结果的类型声明。

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

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

没有declare(strict_types=1)我知道当你插入错误的类型时,它会被转换。如果您要为$example输入一个数字,它将被转换为字符串。如果您将浮点数添加为$someNumber,则会将其转换为舍入数字。通过decleration,您会收到类型错误。

除了可能的“最佳实践”之外,使用类型声明更新我的代码会改善代码的性能吗?我认为它可能因为我现在告诉解释器会发生什么,但是它还可能添加额外的类型检查 更新这些功能是否值得付出努力和时间?

1 个答案:

答案 0 :(得分:17)

最终,在添加类型声明时,性能不应该是您的关注。它们的存在是为了让程序员的生活更轻松,而不是解释器。如果您认为它们会对您有所帮助,请使用它们。是否使用类型声明不太可能是代码性能的主要决定因素。

据说,目前(PHP 7.0)在使用类型声明时实际上有一个小的性能惩罚,因为PHP现在必须检查传入和传出的值的类型功能。根本不检查更快,这是当你没有类型声明时会发生的事情。

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

严格键入会强制您传递正确的类型

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

类型声明可以避免重复的类型转换

如果使用类型声明,无论是否使用严格类型,通常都会避免重复的类型转换为相同的值。

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

但是如果你在该参数上有一个类型声明,它只会自动转换一次(弱打字模式)或者你自己明确转换它。

类型声明使PHP能够进行类型检查

类型声明为PHP运行时提供保证,有时可以使用它来避免它必须执行的类型检查。例如,采用以下代码行:

$a = $b * $c;

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

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

使用OPcache时,此优化在PHP 7.1中实现。

也可以实现类似的优化来摆脱参数和返回值类型检查。例如,如果一个函数声明一个参数是一个int,那么如果它然后将该参数传递给另一个也需要int的函数,则不需要再次检查它的类型。 PHP 7.1当前可以删除一些不必要的返回类型检查(使用OPcache时更多),但不能进行参数类型检查。

由于这些类型的优化,具有类型声明的代码的性能损失变得越来越小,并且具有类型声明的代码具有相当大的潜力而不是将来的代码。