首页 > 后端开发 > php教程 > 键入PHP中的暗示

键入PHP中的暗示

Joseph Gordon-Levitt
发布: 2025-02-28 08:53:14
原创
841 人浏览过

Type Hinting in PHP

关键要点

  • PHP 的类型提示允许开发者在函数声明中指定参数的预期数据类型,从而增强代码的健壮性和可读性。但是,PHP 的类型提示不支持标量数据类型,例如字符串或整数。
  • PHP 是一种弱类型语言,这意味着它不要求你声明数据类型。在 PHP 5.4 中添加标量 PHP 类型提示一直存在争议,反对者认为这违背了 PHP 的基本设计。尽管最初得到支持,但由于社区的回应,此功能并未进入 PHP 5.4 版本。
  • 尽管 PHP 的类型提示有限制,但当参数不是标量类型时,你可以执行基本验证来达到此目的。在这种情况下,可以使用 is_string()is_int() 等函数来引发错误或抛出异常。

从 PHP 5 开始,你可以使用类型提示来指定函数声明中参数的预期数据类型。调用函数时,PHP 将检查参数是否为指定的类型。如果不是,运行时将引发错误并停止执行。有效的类型包括接收对象的类名和接收数组的 array。以下是一个示例:

<?php
function enroll(Student $student, School $school) {
    echo "Enrolling " . $student->name . " in " . $school->name;
}
?>
登录后复制

通过告诉 PHP enroll() 方法期望接收什么类型的对象,你可以确保学生被注册到学校而不是修道院或 401K 计划中。同样,你知道不会有任何顽固的厚皮动物出现在三年级的第一天。如果我试图将自己注册到医疗保险会发生什么?

<?php
$me = new Student("Amanda");
$medicare = new Program("Medicare");
$enroll = enroll($me, $medicare);
?>
登录后复制

虽然我是一名学生,但会发生以下错误:

<code>Catchable fatal error: Argument 2 passed to enroll() must be an instance of School, instance of Program given, called in typehint.php on line 32 and defined in typehint.php on line 6</code>
登录后复制

如果使用 <cod>null 作为参数的默认值,它也将被允许。以下是一个示例,这次使用数组:

<?php
function startParty(array $guests, array $food = null) {
    // party stuff...
}
$guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble");
startParty($guests, null);
?>
登录后复制

只要有客人,无论有没有食物,都会有派对。

类型提示的局限性

任何已定义的类都可以是有效的类型提示,尽管 PHP 不支持泛型对象的类型提示。其他情况呢?这是一个关于 PHP 类型提示局限性的特殊示例:

<?php
function stringTest(string $string) {
    echo $string;
}
stringTest("definitely a string");
?>
登录后复制
<code>Catchable fatal error: Argument 1 passed to stringTest() must be an instance of string, string given, called in typehint.php on line 42 and defined in typehint.php on line 39</code>
登录后复制

你不是第一个想到“这是什么疯狂?我给了你一个字符串实例,你却抱怨它必须是一个字符串实例!”没关系。这是常有的事。事实上,乍一看,这可能是一个相当令人困惑的错误消息。stringTest() 并不是在寻找字符串,而是在寻找字符串类的实例。PHP 的类型提示不支持标量数据类型,例如字符串或整数值。但是没关系!如果你需要在参数不是标量类型(例如字符串或整数)时引发错误或抛出异常,可以使用 is_string()is_int() 等函数执行基本验证来达到此目的。

标量战争

关于在 PHP 5.4 中添加标量 PHP 类型提示,存在一些争议。反对更改的人认为,这种支持会违背 PHP 的基本设计。PHP 被认为是一种弱类型语言。本质上,这意味着 PHP 不要求你声明数据类型。变量仍然与它们关联的数据类型相关联,但你可以做一些激进的事情,例如将字符串添加到整数而不会导致错误。2010 年 5 月,对标量类型提示的支持被添加到 PHP 主干中。但由于社区的回应,此功能不会进入 5.4 版本。

总结

类型提示是引入 PHP 用于面向对象编程的技术(特别是用于识别捕获异常的类型)。我鼓励你阅读更多关于在此处使用对象的信息。图片来自 Carlos E. Santa Maria / Shutterstock

PHP 类型提示常见问题解答 (FAQ)

PHP 类型提示的重要性是什么?

PHP 中的类型提示是一个重要特性,允许开发者在函数声明中指定参数的预期数据类型。它通过确保函数接收正确类型的数值来增强代码的健壮性。这导致代码中的错误和漏洞更少,使其更可靠且更容易调试。它还提高了代码的可读性,使其他开发者更容易理解代码的功能。

我可以在 PHP 中对所有数据类型使用类型提示吗?

PHP 支持对多种数据类型进行类型提示,包括对象、数组、接口、可调用和可迭代。但是,需要注意的是,PHP 直到 7.0 版本才支持标量类型提示(int、float、string 和 bool)。从 PHP 7.0 开始,你可以对所有数据类型使用类型提示。

如果传递的参数的数据类型与类型提示不匹配会发生什么?

如果传递的参数的数据类型与函数声明中的类型提示不匹配,PHP 将抛出“致命错误”。此错误将停止脚本的执行,防止任何进一步的处理。这就是为什么必须确保将正确的数据类型传递给函数的原因。

PHP 类型提示如何与类继承一起工作?

在 PHP 中,类型提示可以与类继承一起使用。如果函数期望某个特定类类型的参数,它也将接受该类的子类的实例。这是因为子类是其父类的特定类型,因此满足类型提示。

我可以在 PHP 的内置函数中使用类型提示吗?

不可以,PHP 中的类型提示只能用于用户定义的函数。PHP 的内置函数不支持类型提示。但是,这些函数通常具有处理不同数据类型的内部机制。

PHP 类型提示中的严格模式是什么?

PHP 类型提示中的严格模式是 PHP 7.0 中引入的一个特性。启用严格模式后,PHP 将根据类型提示强制执行数据类型的精确匹配。如果传递的参数的数据类型与类型提示不完全匹配,即使该参数可以强制转换为正确的类型,PHP 也会抛出“致命错误”。

如何在 PHP 中启用严格模式?

要在 PHP 中启用严格模式,你需要在 PHP 文件的顶部声明 declare(strict_types=1);。此声明必须是脚本中的第一个语句。

PHP 类型提示中弱模式和严格模式的区别是什么?

PHP 类型提示中弱模式和严格模式的区别在于 PHP 如何处理类型不匹配。在弱模式下,如果可能,PHP 将尝试将传递的参数强制转换为正确的数据类型。相反,在严格模式下,PHP 将不会尝试强制转换值,如果数据类型不完全匹配,则会抛出“致命错误”。

我可以对函数返回值使用类型提示吗?

是的,从 PHP 7.0 开始,你可以对函数返回值使用类型提示。此特性允许你指定函数返回值的预期数据类型,从而增强代码的可靠性和可读性。

PHP 中的可空类型提示是什么?

可空类型提示是 PHP 7.1 中引入的一个特性。它允许你指定函数参数或返回值可以是指定类型或 null。要使类型提示可为空,请在类型名称前加上问号 (?)。例如,“?string”表示该值可以是字符串或 null。

以上是键入PHP中的暗示的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板