你应该使用严格模式吗?
strict_types=1 仅当我们想要对标量类型进行严格类型检查时才需要,但启用严格模式仍然有一些明显的好处;一方面,实施严格的编码风格往往会使开发人员变得更好,这可能足以保证将其包含在内。
可以启用严格模式以强制标量类型的类型提示;传统上,PHP 是一种弱类型语言,这意味着字符串可以用作整数,反之亦然,而不会停止脚本的执行。
启用严格模式后,PHP 将抛出错误并停止脚本执行。
strict_types=1 声明可以添加到组合根目录(即 index.php)的顶部,以在全局范围内为项目应用该指令,这是通过使用 PHP 的声明构造完成的。
要为标量类型启用严格模式,我们需要在 index.php 的顶部包含一个声明指令:
<?php declare(strict_types=1); include 'function.php'; echo say_hallo(200);
和functions.php:
<?php function say_hallo(string $string) { return $string; }
以上将导致类型错误:
Fatal error: Uncaught TypeError: say_hallo(): Argument #1 ($string) must be of type int, string given, called in /var/www/this.php on line 4 and defined in /var/www/functions.php:3 Stack trace: #0 /var/www/index.php(4): say_hallo() #1 {main} thrown in /var/www/functions.php on line 3
标量类型的转换似乎很少有任何问题,因此包含声明以启用严格模式的好处同样微不足道。
用作类型的类
在 PHP 中,任何命名类也可以用作类型,因此在声明依赖项时,我们可以限制在参数中传递的对象类型。
当采用面向对象的方法时,通常更喜欢使用对象而不是数组来通过依赖注入将数据传递给其他对象。
使用对象而不是数组的主要好处之一是代码编辑器将为对象属性提供自动完成建议,当然,另一个好处是类型提示。
因为类可以在 PHP 中用作类型,所以我们可以利用它们来确保将正确的数据格式传递给依赖于特定数据的对象或者函数。
这是用于创建新用户对象的“用户”类:
$some_user = new user('Jacob', 'jacob@example.com', 'Earth'); class user { public $name; public $email; public $address; public function __construct(string $name, string $email, string $address) { $this->name = $name; $this->email = $email; $this->address = $address; } }
然后只需在依赖此数据的类或者函数的定义中使用用户类:
class show_user { public $name; public $email; public $address; public function __construct(user $user) { $this->user = $user; echo $this->user->name; exit(); } }
现在,如果开发人员试图将错误的对象传递给 show_user 类,PHP 将抛出错误以提醒开发人员该问题。
看起来似乎不多,但是在这个级别上使用类型提示开发人员及早发现错误——并且它还将使代码更加自文档化。