【问题标题】:How do we enforce parameter types in PHP?我们如何在 PHP 中强制执行参数类型?
【发布时间】:2021-04-02 14:29:13
【问题描述】:

Java 编译器确保每个方法调用都包含与参数类型兼容的参数。在下面的例子中,传递一些没有实现 LogService 接口的东西甚至不会编译。

public logMessage(LogService logService, String message) {
    logService.logMessage(message);
}

有没有办法用 PHP 实现相同的功能?如果我传递了一个与 LogService 接口不兼容的对象,我想在 IDE 中立即知道,而不是在测试中发现。我目前使用的是 PHP 5.4,但我可以选择更高的版本。

public function logMessage($logService, $message) {
    $logService->logMessage($message);
}

【问题讨论】:

  • 升级到支持参数类型声明的 PHP 版本 (PHP 7)。实际上,请转到 7.3 或更高版本,因为这是当前支持的。您也将获得不错的性能提升。
  • PHP 5.4 已在 5 年前停止使用并获得支持。
  • 是的,我意识到我应该看过去 5.4。在多年没有使用这项技术之后,我刚刚开始用 PHP 编写一些代码,我只是想在我真正考虑任何实现之前记住如何做事。但基本上你是在告诉我,我在 5.4 上浪费时间......
  • 约翰,在我自己的搜索中,我什至没有遇到“暗示”这个词。我看到它几乎回答了我的问题。请整理一个答案帖。

标签: php parameters interface parameter-passing


【解决方案1】:

PHP 7 introduced type declarations 允许您执行您在 Java 示例中显示的操作。如果使用declare(strict_types=1);,如果参数类型与函数签名不匹配,PHP 将抛出致命错误。如果省略它,它将尝试将值类型转换为该类型(就像使用 == 比较运算符与严格的 === 比较运算符时一样)。

public function logMessage(LogService $logService, string $message) {
    $logService->logMessage($message);
}

我建议使用最新版本的 PHP,不仅可以确保您拥有最新的安全补丁,还可以获得最新的功能。例如,可为空的参数类型不是 introduced until PHP 7.1、object types in 7.2 和 union types in 8.0。

【讨论】:

  • 谢谢约翰。我有一个 cPanel 的开发帐户。根据反馈已升级到 7.3。
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2016-08-13
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多