php 8+ 参数类型声明必须写在变量名前,如 string $name;可空类型需用 ? 前缀且默认值为 null;类类型推荐用具体类或接口;strict_types=1 必须显式声明才生效。

PHP 8+ 方法参数类型声明必须写在变量名前
PHP 7.0 开始支持参数类型声明,但真正稳定、覆盖全类型(包括 string、int、bool 等标量)是从 PHP 8.0 起。写错位置会直接报语法错误:Parse error: syntax error, unexpected token ":"。
正确写法是类型紧挨着参数名之前,不能放在后面或用括号包起来:
public function setName(string $name, ?int $age = null): void
常见错误写法(全部非法):
-
function setName($name: string)(冒号后置 —— PHP 不认) -
function setName(string($name))(函数式写法 —— 语法错误) -
function setName($name): string(这是返回值类型,不是参数类型)
可空类型和默认值的顺序不能乱
当参数允许为 null,必须用 ? 前缀声明可空,且默认值必须显式写成 = null;否则 PHP 会拒绝解析。
立即学习“PHP免费学习笔记(深入)”;
比如 ?string $desc 表示“string 或 null”,但如果你只写 string $desc = null,PHP 会报错:Type error: Argument 1 passed to ... must be of the type string, null given。
正确组合方式只有两种:
本文档主要讲述的是mybatis语法和介绍;MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。感兴趣的朋友可
-
?string $desc = null(推荐:类型明确 + 默认值匹配) -
string $desc = ''(非空类型配非空默认值)
混搭如 string $desc = null 或 ?string $desc = 'default' 都会触发严格类型检查失败。
类方法中使用 self、static、parent 作类型需谨慎
这些关键字能当参数类型用,但语义和行为容易被误读:
-
self $obj:表示“必须是定义该方法的那个类的实例”,不接受子类(即使继承了也不行) -
static $obj:支持后期静态绑定,允许传入子类实例 —— 但仅在静态上下文中可靠;用在普通方法参数里意义有限,且 PHP 8.1+ 才正式支持 -
parent $obj:只能用于父类存在、且当前类继承它时;否则直接报错:Parent type used in invalid context
实际项目中,95% 的场景用具体类名(如 User $user)或接口(如 Authenticatable $user)更安全、更易测试。
启用严格模式才真正生效,否则类型声明形同虚设
PHP 默认是“弱类型检查”:没加 declare(strict_types=1); 的文件里,整数 42 传给 string 参数也不会报错,只会静默转成 "42"。
要让类型声明硬校验,必须在文件顶部第一行(不能有空行、BOM、注释)写:
declare(strict_types=1);
这个声明只对当前文件生效,不会影响 include 或 require 的其他文件。漏掉这句,所有参数类型都退化为“建议型”,调试时根本发现不了传参错位的问题。
最容易被忽略的一点:Composer 自动加载的类文件,如果没加这句,哪怕你写了 int $id,传个 "123" 字符串也照常运行 —— 等上线出逻辑异常才去翻日志,已经晚了。






