php 7.1 中对象初始化需通过 __construct() 传参,参数顺序严格、不支持命名参数,可为空类型需显式传 null 或设默认值,匿名类传参位置易错,推荐使用 setter 方法保障封装性。

构造函数传参:对象初始化时直接塞值
PHP 7.1 中,类实例化时传值最标准的方式就是通过 __construct()。只要在类里定义了带参数的构造函数,new 的时候就必须传进去,否则会抛 TypeError(启用 strict_types=1 时更严格)。
- 参数顺序必须严格匹配构造函数声明顺序
- 不支持命名参数(PHP 8.0+ 才有),只能靠位置对齐
- 如果某参数有默认值,它可省略,但必须放在参数列表末尾
示例:
class User {
private $name;
private $age;
public function __construct(string $name, int $age = 18) {
$this->name = $name;
$this->age = $age;
}
}
$user = new User('Alice', 25); // ✅ 正确
$user = new User('Bob'); // ✅ 使用默认 age=18
$user = new User(25, 'Alice'); // ❌ 类型错 + 顺序错 → TypeError
对象属性赋值:实例化后再设值
构造函数没定义或不想强制传参时,可用公共属性或 setter 方法赋值。但注意:PHP 7.1 不支持在 new 后直接链式赋值(如 new User()->name = 'xxx'),必须分步操作。
- 直接写公共属性(
public)最简单,但破坏封装性 - 用
__set()魔术方法可实现“看似直接赋值”,实则走控制逻辑 - setter 方法(如
setName())最推荐,便于校验和扩展
示例:
class Config {
public $host;
public $port;
public function setHost(string $host): self {
$this->host = $host;
return $this;
}
}
$config = new Config();
$config->host = 'localhost'; // ✅ 直接赋 public 属性
$config->setHost('127.0.0.1')->port = 3306; // ✅ 链式调用(仅限返回 $this)
可为空类型传参:?string、?array 这类写法要小心
PHP 7.1 引入的可为空类型(如 ?string)只影响类型声明,不改变传参方式本身。它允许你传 null,但不能“不传”——缺参数仍报 ArgumentCountError。
-
function foo(?string $name):可以传null或字符串,但不能省略该参数 -
function bar(?string $name = null):这时才真正可选,因为给了默认值 - 传
null时,必须显式写出null,不能留空
错误示范:
function loadUser(?int $id) { return $id ?? 0; }
loadUser(); // ❌ ArgumentCountError: Too few arguments
loadUser(null); // ✅ 返回 0
loadUser(123); // ✅ 返回 123
匿名类传参:new class() 后面直接跟括号
PHP 7.0+ 支持匿名类,但它传参容易被忽略——参数不是写在花括号里,而是紧跟在 new class 后面的括号中,和普通类一模一样。
- 构造函数定义在匿名类内部,但调用时语法不变
- 漏掉括号或括号里没填值,就会触发
TypeError - 匿名类无法复用,适合一次性轻量对象,别滥用
示例:
$logger = new class('debug') {
private $level;
public function __construct(string $level) {
$this->level = $level;
}
public function log(string $msg): void {
echo "[{$this->level}] {$msg}\n";
}
};
$logger->log('Ready'); // ✅ 输出 [debug] Ready
真正容易被忽略的是:构造函数参数必须出现在 new class(...) 的括号里,而不是匿名类定义块内;另外,PHP 7.1 没有命名参数,所有位置都得靠数序号对齐,写错一个就崩。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











