函数中的类型声明会让我的代码执行得更好吗?
Will type declaration in functions make my code perform better?
PHP 7 正在慢慢展开,人们开始使用它,我也是。
PHP7 中的一个新功能是您可以 give functions a type declaration 输入,并为结果声明类型。
例如,一个输入必须是字符串,一个是 int,结果将为布尔值:
// PHP <7
function foo($example, $someNumber) {}
// PHP 7
function foo(string $example, int $someNumber): bool{}
without declare(strict_types=1)
我知道当你插入错误的类型时,它会被转换。如果您为 $example
输入一个数字,它将被转换为字符串。如果将浮点数添加为 $someNumber
,它将被转换为整数。随着decleration,你会得到一个类型错误。
除了可能 "best practices" 之外,使用类型声明更新我的代码是否会提高代码的性能? 我认为可以,因为我现在告诉解释器会发生什么,但它也可能会添加额外的类型检查。
更新这些功能是否值得付出努力和时间?
最终,在添加类型声明时,性能不应该是你关心的问题。它们的存在是为了让程序员的生活更轻松,而不是解释器的生活。如果您认为它们对您有帮助,请使用它们。是否使用类型声明不太可能成为代码性能的主要决定因素。
话虽如此,目前 (PHP 7.0) 在使用类型声明时实际上有一个小的性能 惩罚,因为 PHP 现在有检查传入和传出函数的值的类型。根本不检查会更快,当你没有类型声明时就会发生这种情况。
然而,它比那更微妙,情况正在发生变化。
严格类型强制您传递正确的类型
如果您使用严格类型,则必须传递理想类型(例如 int)的值,而不是能够传递其他类型(例如字符串)并让 PHP 转换它为你。传递正确的类型比让 PHP 为您从其他类型转换更快:类型转换需要时间。
类型声明可以避免重复的类型转换
如果您使用类型声明,无论是否使用严格类型,您通常都会避免对相同值重复进行类型转换。
通常,如果您有一个函数执行多个数字运算,并且您传入一个字符串参数,PHP 每次执行时都必须将其转换为适当的数字类型(int 或 float)用它进行操作。
但是,如果您对该参数有类型声明,它只会被转换一次,要么自动(弱类型模式),要么因为您自己显式转换它。
类型声明使PHP能够省略类型检查
类型声明为您的 PHP 运行时提供保证,它有时可以用来避免它必须执行的类型检查。例如,采用以下代码行:
$a = $b * $c;
没有类型声明,PHP 首先必须对 $b
和 $c
进行内部类型检查,然后才能真正将它们相乘; PHP需要确定都是number类型,如果不是则进行转换,然后进行相应类型的乘法(int
×int
,float
×int
, 等等).
但是如果你事先声明了$b
和$c
的类型,那么PHP就不需要在这里检查它们,可以立即进行实际的乘法运算。那更快。如果您在函数内对这些变量进行多次操作,则尤其如此。
此优化在 PHP 7.1 使用 OPcache 时实现。
可以实施类似的优化来摆脱参数和 return 值类型检查。例如,如果一个函数声明一个参数是一个 int,如果它随后将该参数传递给另一个也需要一个 int 的函数,则无需再次检查其类型。 PHP 7.1 目前可以删除一些不必要的 return 类型检查(使用 OPcache 时更多),但不能删除参数类型检查。
由于这些类型的优化,具有类型声明的代码的性能损失越来越小,并且将来具有类型声明的代码比没有类型声明的代码更快的潜力很大。
PHP 7 正在慢慢展开,人们开始使用它,我也是。
PHP7 中的一个新功能是您可以 give functions a type declaration 输入,并为结果声明类型。
例如,一个输入必须是字符串,一个是 int,结果将为布尔值:
// PHP <7
function foo($example, $someNumber) {}
// PHP 7
function foo(string $example, int $someNumber): bool{}
without declare(strict_types=1)
我知道当你插入错误的类型时,它会被转换。如果您为 $example
输入一个数字,它将被转换为字符串。如果将浮点数添加为 $someNumber
,它将被转换为整数。随着decleration,你会得到一个类型错误。
除了可能 "best practices" 之外,使用类型声明更新我的代码是否会提高代码的性能? 我认为可以,因为我现在告诉解释器会发生什么,但它也可能会添加额外的类型检查。
更新这些功能是否值得付出努力和时间?
最终,在添加类型声明时,性能不应该是你关心的问题。它们的存在是为了让程序员的生活更轻松,而不是解释器的生活。如果您认为它们对您有帮助,请使用它们。是否使用类型声明不太可能成为代码性能的主要决定因素。
话虽如此,目前 (PHP 7.0) 在使用类型声明时实际上有一个小的性能 惩罚,因为 PHP 现在有检查传入和传出函数的值的类型。根本不检查会更快,当你没有类型声明时就会发生这种情况。
然而,它比那更微妙,情况正在发生变化。
严格类型强制您传递正确的类型
如果您使用严格类型,则必须传递理想类型(例如 int)的值,而不是能够传递其他类型(例如字符串)并让 PHP 转换它为你。传递正确的类型比让 PHP 为您从其他类型转换更快:类型转换需要时间。
类型声明可以避免重复的类型转换
如果您使用类型声明,无论是否使用严格类型,您通常都会避免对相同值重复进行类型转换。
通常,如果您有一个函数执行多个数字运算,并且您传入一个字符串参数,PHP 每次执行时都必须将其转换为适当的数字类型(int 或 float)用它进行操作。
但是,如果您对该参数有类型声明,它只会被转换一次,要么自动(弱类型模式),要么因为您自己显式转换它。
类型声明使PHP能够省略类型检查
类型声明为您的 PHP 运行时提供保证,它有时可以用来避免它必须执行的类型检查。例如,采用以下代码行:
$a = $b * $c;
没有类型声明,PHP 首先必须对 $b
和 $c
进行内部类型检查,然后才能真正将它们相乘; PHP需要确定都是number类型,如果不是则进行转换,然后进行相应类型的乘法(int
×int
,float
×int
, 等等).
但是如果你事先声明了$b
和$c
的类型,那么PHP就不需要在这里检查它们,可以立即进行实际的乘法运算。那更快。如果您在函数内对这些变量进行多次操作,则尤其如此。
此优化在 PHP 7.1 使用 OPcache 时实现。
可以实施类似的优化来摆脱参数和 return 值类型检查。例如,如果一个函数声明一个参数是一个 int,如果它随后将该参数传递给另一个也需要一个 int 的函数,则无需再次检查其类型。 PHP 7.1 目前可以删除一些不必要的 return 类型检查(使用 OPcache 时更多),但不能删除参数类型检查。
由于这些类型的优化,具有类型声明的代码的性能损失越来越小,并且将来具有类型声明的代码比没有类型声明的代码更快的潜力很大。