php7 中的严格模式
php7 增加了严格模式,在严格模式下,可以给 ide 提供更好的提示,也有助于编写高质量的 php 代码,同时当你添加了参数类型限定和返回类型限定,可以对 php 的底层解析执行做到一些优化
类型说明
如何开启严格模式
php 模式 strict_types
的值(1或者0),1 表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。
// 文件开始出写
declare(strict_types=1);
参数类型限定
可用的参数类型列表
int
float
bool
string
interfaces
array
callable
self
iterable
object
自定义的类和接口
mixed(php8中新增值,可以为任何类型)
示例:
declare(strict_types=1);
function sum(int ...$ints)
{
return array_sum($ints);
}
print(sum(2, '3', 4.1)); /
PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……
返回类型限定
可用的参数类型列表
int
float
bool
string
interfaces
array
callable
self
iterable
object
void
自定义的类和接口
mixed(php8中新增值,可以为任何类型)
declare(strict_types=1);
function testInt(int $value): int
{
return $value + 1.1;
}
print(testInt(5));
Fatal error: Uncaught TypeError: Return value of testInt() must be of the type integer, float returned...
void 函数
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。
返回的类型还有 void,定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。
对于特殊类型的说明
-
void
类型的返回值返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。
function swap(&$left, &$right) : void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
-
null
如果参数或返回类型可能涉及到有无2中情况包含null
时,需要在类型限定前加一个?
,代表可能有值或者为 null
declare(strict_types=1);
function test(?string $str): ?string
{
return $str;
}
关于类中继承的说明
- 当覆盖一个父类方法时,子类方法的返回值类型声明必须与父类一致(php7.4新增协变返回类型,可以是其子类)。如果父类方法没有定义返回类型,那么子类方法可以定义任意的返回值类型声明。
示例(演示了php7.4中的协变返回类型):
class Parent {}
class Child extends Parent {}
class A
{
public function test(): Parent
{ /* … */ }
}
class B extends A
{
public function test(): Child
{ /* … */ }
}
php7.4 新增的特性
- 可以添加对类属性的类型限定
class User {
public int $id;
public string $name;
protected Classname $classType;
private ?Classname $nullableClassType;
}
当你使用如下方式调用时,php 会抛出错误
错误原因:定义了一个 int 类型的 $id ,但是赋值了一个 string 类型的值
$user = new User;
$user->id = 'a'; // PHP Fatal error
结语
使用严格模式,给 php 的这个弱类型语言,添加了一些强硬的编码规范,看似限制了你的开发自由度,但这些有助于与多人协作开发,使代码的可读性更高,同时可以是解释器减少了类型检查,可以提升一些性能。