- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混合
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc & Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期与时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较运算符
- PHP 控制语句
- PHP - 决策制定
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - Final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET & POST
- PHP - 文件上传
- PHP - Cookies
- PHP - Sessions
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 清理输入
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 编码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 针对 C 开发人员
- PHP - 针对 PERL 开发人员
- PHP - 框架
- PHP - Core PHP 与框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 预期
- PHP - Use 语句
- PHP - 整数除法
- PHP - 已弃用的功能
- PHP - 已删除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP - 标量类型声明
从 PHP 5 版本开始,就提供了类型提示的功能。类型提示指的是在函数定义中提供参数的数据类型的做法。在 PHP 7 之前,只能在函数中使用数组、可调用和类作为类型提示。PHP 7 及以后,您还可以为标量数据类型(如 int、string、bool 等)的参数插入类型提示。
PHP 是一种动态(且弱)类型语言。因此,在定义函数时,不需要声明参数的类型,这在像 C 或 Java 这样的静态类型语言中是必需的。
PHP 中函数的典型定义如下所示:
function addition($x, $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; }
这里,我们假设参数 $x 和 $y 是数字。但是,即使传递给函数的值不是数字,PHP 解析器也会尽最大可能将变量强制转换为兼容的类型。
如果传递的值之一是数字的字符串表示形式,另一个是数字变量,则 PHP 会将字符串变量强制转换为数字以执行加法运算。
示例
请查看以下示例:
<?php function addition($x, $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="10"; $y=20; addition($x, $y); ?>
它将产生以下输出:
First number: 10 Second number: 20 Addition: 30
但是,如果上面示例中的 $x 是一个不包含有效数字表示形式的字符串,则会遇到错误。
<?php function addition($x, $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="Hello"; $y=20; addition($x, $y); ?>
运行此代码,看看它如何显示错误。
PHP 7 中的标量类型声明
PHP 7 版本引入了一项新功能,允许定义一个函数,其参数的数据类型可以在括号内指定。
PHP 7 引入了以下标量类型声明:
Int
Float
Bool
String
接口
数组
可调用
较旧版本的 PHP 仅允许将数组、可调用和类类型用作类型提示。此外,在较旧版本的 PHP(PHP 5)中,致命错误曾经是可恢复的错误,而新版本(PHP 7)则返回一个可抛出的错误。
标量类型声明以两种模式实现:
强制模式 - 强制模式是默认模式,不需要指定。
严格模式 - 必须明确提示严格模式。
强制模式
前面示例中定义的 addition() 函数现在可以通过合并类型声明如下重写:
function addition(int $x, int $y) { echo "First number: $x Second number: $y Addition: " . $x+$y; }
请注意,如果字符串包含整数,则解析器仍然会强制转换不兼容的类型,即字符串到整数,就像之前一样。
示例
请查看以下示例:
<?php function addition(int $x, int $y) { echo "First number: " . $x; echo "\nSecond number: " . $y; echo "\nAddition: " . $x+$y; } $x="10"; $y=20; echo addition($x, $y); ?>
它将产生以下输出:
First number: 10 Second number: 20 Addition: 30
显然,这是因为 PHP 是一种弱类型语言,因为 PHP 会尝试将字符串类型的变量强制转换为整数。PHP 7 引入了一个严格模式功能来解决此问题。
严格模式
为了解决 PHP 的弱类型检查问题,引入了严格模式。此模式通过声明语句启用:
declare (strict_types=1);
您应该将此语句放在 PHP 脚本的顶部(通常就在 PHP 标签下方)。这意味着标量的类型严格性是在每个文件的基础上配置的。
在弱模式下,strict_types 标志为 0。将其设置为 1 会强制 PHP 解析器检查传递的参数和值的兼容性。在上述代码中添加此语句并检查结果。它将显示以下错误消息:
Fatal error: Uncaught TypeError: addition(): Argument #1 ($x) must be of type int, string given, called in add.php on line 12 and defined in add.php:4 Stack trace: #0 add.php(12): addition('10', 20) #1 {main} thrown in add.php on line 4
示例
以下是函数定义中标量类型声明的另一个示例。启用严格模式时,如果将不兼容的类型作为参数传递,则会引发致命错误。
<?php // Strict mode // declare(strict_types = 1); function sum(int ...$ints) { return array_sum($ints); } print(sum(2, '3', 4.1)); ?>
取消此代码顶部的声明语句的注释并运行它。现在它将产生一个错误:
Fatal error: Uncaught TypeError: sum(): Argument #2 must be of type int, string given, called in add.php on line 9 and defined in add.php:4 Stack trace: #0 add.php(9): sum(2, '3', 4.1) #1 {main} thrown in add.php on line 4
类型提示功能主要由 IDE 用于提示用户有关函数声明中使用的参数的预期类型。以下屏幕截图显示了在您键入时 VS Code 编辑器弹出的函数原型。