PHP7.2中的新功能(参数类型声明)
PHP 7.2已于 11⽉30⽇正式发布,该版本具有新特性,功能和改进,可以让我们编写更好的代码。在这篇⽂章中,我将介绍⼀些PHP
7.2中最有趣的语⾔特性-参数类型声明。
参数类型声明
从PHP 5开始,我们可以在函数的声明中指定预期要传递的参数类型。如果给定值的类型不正确,那么PHP将引发错误。参数类型声明
(也称为类型提⽰)指定预期传递给函数或类⽅法的变量的类型。
来⼀个例⼦:
class MyClass {
public $var = 'Hello World';
}
$myclass = new MyClass;
function test(MyClass $myclass){
return $myclass->var;
}
echo test($myclass);
在这段代码中,测试函数需要MyClass的⼀个实例。不正确的数据类型会导致以下致命错误:
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and define 由于PHP 7.2 类型提⽰可以与对象数据类型⼀起使⽤,并且此改进允许将通⽤对象声明为函数或⽅法的参数。这⾥是⼀个例⼦:
class MyClass {
public $var = '';
}
class FirstChild extends MyClass {
public $var = 'My name is Jim';
}
class SecondChild extends MyClass {
public $var = 'My name is John';
}
$firstchild = new FirstChild;
$secondchild = new SecondChild;
function test(object $arg) {
return $arg->var;
}
echo test($firstchild);
echo test($secondchild);
在这个例⼦中,我们调⽤了两次测试函数,每次调⽤都传递⼀个不同的对象。在以前的PHP版本中这是不可能的。
对象返回类型声明
如果参数类型声明指定函数参数的预期类型,则返回类型声明指定返回值的预期类型。
返回类型声明指定了函数预期返回的变量的类型。
从PHP 7.2开始,我们被允许为对象数据类型使⽤返回类型声明。这⾥是⼀个例⼦:php8兼容php7吗
class MyClass {
public $var = 'Hello World';
}
$myclass = new MyClass;
function test(MyClass $arg) : object {
return $arg;
}
echo test($myclass)->var;
以前的PHP版本会导致以下致命错误:
Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10
当然,在PHP 7.2中,这个代码会回应'Hello World'。
参数类型宽限声明
PHP⽬前不允许⼦类和它们的⽗类或接⼝之间的参数类型有任何差异。那是什么意思?
考虑下⾯的代码:
<?php
class MyClass {
public function myFunction(array $myarray) { /* ... */ }
}
class MyChildClass extends MyClass {
public function myFunction($myarray) { /* ... */ }
}
这⾥我们省略了⼦类中的参数类型。在PHP 7.0中,此代码会产⽣以下警告:
Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8
⾃PHP 7.2以来,我们被允许在不破坏任何代码的情况下省略⼦类中的类型。这个建议将允许我们升级类以在库中使⽤类型提⽰,⽽不需要更新所有的⼦类。
在列表语法中尾随逗号
数组中最后⼀项之后的尾随逗号是PHP中的有效语法,有时为了轻松附加新项⽬并避免由于缺少逗号⽽导致解析错误,⿎励使⽤它。⾃PHP 7.2起,我们被允许在 分组命名空间中使⽤尾随逗号。
请参阅列表语法中的尾随逗号以便更深⼊地查看此RFC和⼀些代码⽰例。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论