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

Mar*_*ijn 9 php performance php-7

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

PHP7的一个新特性是,您可以为函数提供输入的类型声明,以及结果的类型声明.

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

// PHP <7
function foo($example, $someNumber) {}
// PHP 7
function foo(string $example, int $someNumber): bool{}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*rea 18

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

话虽如此,目前(PHP 7.0)在使用类型声明时实际上有一个小的性能损失,因为PHP现在必须检查传入和传出函数的值的类型.根本不检查更快,这是当你没有类型声明时会发生的事情.

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

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

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

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

如果使用类型声明,无论是否使用严格键入,通常都会避免对相同值重复进行类型转换.

通常,如果你有一个执行多个数字操作的函数,并且你传入一个字符串参数,PHP每次使用它进行操作时都必须将它转换为适当的数字类型(int或float).

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

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

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

$a = $b * $c;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • PHP 7.1可以删除一些返回类型检查,但目前没有省略参数检查. (2认同)