PHP7.2已于11月30日正式发布,该版本具有新的特性、功能和改进,使我们能够编写更好的代码。在本文中,我将介绍PHP7.2中一些最有趣的语言特性——参数类型声明。参数类型声明从PHP5开始,我们可以在函数声明中指定期望传递的参数类型。如果给定值的类型不正确,则PHP将抛出错误。参数类型声明(也称为类型提示)指定预期传递给函数或类方法的变量类型。举个例子:classMyClass{public$var='HelloWorld';}$myclass=newMyClass;functiontest(MyClass$myclass){return$myclass->var;}echotest($myclass);在这段代码中,测试函数需要一个MyClass的实例。不正确的数据类型导致以下致命错误:Fatalerror:UncaughtTypeError:Argument1passedtotest()mustbeaninstanceofMyClass,stringgiven,calledin/app/index.phponline12anddefinedin/app/index.php:8由于PHP7.2类型提示可用于对象数据类型,这一改进允许将通用对象声明为函数或方法的参数。这是一个例子:classMyClass{public$var='';}classFirstChildextendsMyClass{public$var='MynameisJim';}classSecondChildextendsMyClass{public$var='MynameisJohn';}$firstchild=newFirstChild;$secondchild=newSecondChild;functiontest(object$arg){return$arg->var;}echotest($firstchild);echotest($secondchild);}在这个例子中,我们两次调用Test函数,每次调用传递一个不同的对象。这在以前的PHP版本中是不可能的。对象返回类型声明如果参数类型声明指定了函数参数的预期类型,则返回类型声明指定了返回值的预期类型。返回类型声明指定函数预期返回的变量类型。从PHP7.2开始,我们可以使用对象数据类型的返回类型声明。这是一个例子:beforePHP版本导致以下致命错误:Fatalerror:UncaughtTypeError:Returnvalueoftest()mustbeaninstanceofobject,instanceofMyClassreturnedin/app/index.php:10当然,在PHP7.2中,此代码将以“HelloWorld”响应。参数类型宽容声明PHP目前不允许子类及其超类或接口之间的参数类型有任何差异。这意味着什么?考虑以下代码:这里我们省略了子类中的参数类型。在PHP7.0中,此代码产生以下警告:Warning:DeclarationofMyChildClass::myFunction($myarray)shouldbecompatiblewithMyClass::myFunction(array$myarray)in%sonline8从PHP7.2开始,我们允许省略子类中的类型而不破坏任何代码。这个建议将允许我们升级类以使用库中的类型提示,而无需更新所有子类。列表语法中的尾随逗号数组中最后一项后的尾随逗号是PHP中的有效语法,有时鼓励轻松附加新项并避免由于缺少逗号而导致的解析错误。从PHP7.2开始,我们可以在命名空间分组中使用尾随逗号。请参阅列表语法中的尾随逗号以更深入地了解此RFC和一些代码示例。
