当前位置: 首页 > news >正文

PHP命名参数与构造器提升详解

PHP命名参数与构造器提升详解

PHP8引入了两个非常实用的特性,命名参数和构造器属性提升。这些特性让代码写起来更简洁、更清晰。

命名参数允许在调用函数时指定参数名,不用按顺序传参。这在参数多的时候特别有用。

```php
// PHP8命名参数
function createUser(
string $name,
string $email,
int $age = 0,
string $country = '',
string $city = '',
bool $active = true,
array $roles = ['user'],
): array {
return compact('name', 'email', 'age', 'country', 'city', 'active', 'roles');
}

// 传统方式(按顺序)
$user1 = createUser('张三', 'zhangsan@test.com', 28, '中国', '北京', true, ['user', 'admin']);

// 命名参数(只看需要的参数)
$user2 = createUser(
name: '李四',
email: 'lisi@test.com',
age: 30,
country: '中国',
);

// 跳过中间参数
$user3 = createUser(
name: '王五',
email: 'wangwu@test.com',
roles: ['editor', 'user'],
);

print_r($user2);
print_r($user3);
?>
```

命名参数让代码的可读性大幅提升。不用去数第几个参数是什么,直接看名字就知道传的是什么值。而且在需要跳过可选参数时特别方便。

构造器属性提升把属性声明和构造器参数合并在一起。PHP8之前,你要先声明属性,再在构造器中赋值。现在一行搞定。

```php
// PHP8之前
class UserOld
{
private string $name;
private string $email;
private ?string $phone;
private bool $active;

public function __construct(
string $name,
string $email,
?string $phone = null,
bool $active = true
) {
$this->name = $name;
$this->email = $email;
$this->phone = $phone;
$this->active = $active;
}
}

// PHP8构造器属性提升
class User
{
public function __construct(
public string $name,
public string $email,
private ?string $phone = null,
private bool $active = true,
private \DateTime $createdAt = new \DateTime(),
) {}

public function getInfo(): string
{
return "{$this->name} ({$this->email})" . ($this->active ? ' [活跃]' : ' [不活跃]');
}
}

$user = new User('张三', 'zhangsan@test.com', '13800138000');
echo $user->getInfo() . "\n";
echo $user->name . "\n"; // public属性可以直接访问
?>
```

构造器属性提升加上命名参数,让代码变得非常简洁:

```php
// DTO类
class OrderDTO
{
public function __construct(
public readonly string $orderId,
public readonly int $userId,
public readonly array $items,
public readonly float $total,
public readonly string $status = 'pending',
public readonly ?\DateTime $paidAt = null,
public readonly ?string $couponCode = null,
public readonly array $metadata = [],
) {}
}

class ProductDTO
{
public function __construct(
public readonly int $id,
public readonly string $name,
public readonly float $price,
public readonly int $stock,
public readonly ?string $description = null,
public readonly array $tags = [],
public readonly bool $active = true,
) {}
}

// 使用命名参数创建DTO
$order = new OrderDTO(
orderId: 'ORD-' . uniqid(),
userId: 123,
items: [
['product_id' => 1, 'quantity' => 2, 'price' => 99.99],
['product_id' => 2, 'quantity' => 1, 'price' => 199.99],
],
total: 399.97,
couponCode: 'SAVE20',
metadata: ['source' => 'mobile'],
);

$product = new ProductDTO(
id: 1,
name: 'PHP编程入门',
price: 59.99,
stock: 100,
tags: ['php', '编程', '入门'],
);

echo "订单: {$order->orderId}, 金额: {$order->total}\n";
echo "商品: {$product->name}, 价格: {$product->price}\n";
?>
```

readonly属性可以和构造器提升一起用,创建不可变对象:

```php
readonly class Config
{
public function __construct(
public string $dbHost,
public int $dbPort,
public string $dbName,
public string $dbUser,
public string $dbPass,
public string $appEnv,
public bool $debug,
public int $cacheTtl,
public array $allowedOrigins = [],
) {}
}

$config = new Config(
dbHost: 'localhost',
dbPort: 3306,
dbName: 'test',
dbUser: 'root',
dbPass: 'secret',
appEnv: 'development',
debug: true,
cacheTtl: 3600,
allowedOrigins: ['http://localhost:3000'],
);

// $config->dbHost = 'other'; // 报错,readonly属性不能修改
echo "数据库: {$config->dbHost}:{$config->dbPort}/{$config->dbName}\n";
?>
```

这些特性让PHP代码变得更简洁、更安全、更可读。升级到PHP8后,建议尽快用上这些新特性,它们能实实在在地提高代码质量和开发效率。

http://www.jsqmd.com/news/945435/

相关文章:

  • 5步轻松掌握fanqienovel-downloader:打造永不消失的个人小说图书馆
  • 3分钟快速上手:终极RPG Maker解密工具完全指南
  • AI工作流效率翻倍的7个智能设置细节:微软/谷歌认证专家实测数据全公开
  • HBase与Hadoop:基于什么开发?深度剖析与架构图
  • 模型准确率下降却无告警?——用3类动态基线+5维监控维度重建AI可信度防线
  • 一键备份QQ空间回忆:GetQzonehistory完整使用指南
  • 2026苏州防水维修哪家好?权威靠谱防水公司推荐|全屋漏水根治测评 - 苏易修缮
  • 3步永久保存QQ空间历史记录:GetQzonehistory开源备份方案详解
  • 降AIGC黑科技揭秘!AI率92%暴降至5%!实测10款降AIGC平台!免费额度狂薅攻略
  • FreeRTOS 手动移植教程(五):信号量 —— 任务同步与中断通知的优雅解决方案
  • 2026年速冻蔬菜批发供应商推荐榜单:南通/海门/江苏出口级IQF BQF速冻蔬菜,预制菜食堂餐饮及日产能140吨优质厂家精选 - 品牌企业推荐师(官方)
  • 虚幻引擎5时代,从Cascade迁移到Niagara的完整避坑指南(含转换插件实战)
  • 终极指南:如何用FanControl免费实现Windows风扇智能控制
  • Harness Hooks机制:实现Agent行为实时干预与校验
  • AI工具如何真正接管排班?揭秘头部企业已验证的7步集成路径与ROI提升217%的关键数据
  • 【2024最稀缺整合方案】:基于LLM+GraphDB的社区智能治理系统,已验证提升用户留存率41.7%
  • Debian 11 Bullseye 上手体验:从内核 5.10 到 LibreOffice 7.0,新版本带来了哪些惊喜?
  • 出海物联网设备全球网络准入架构:基于Python的自动APN适配与链路保活实战
  • B站缓存视频转换神器:3步实现m4s到MP4的无损快速转换
  • 如何在电脑上轻松编辑PDF | 最新指南
  • 告别“权限不足”:手把手教你用CobaltStrike的Bypass UAC模块搞定Windows提权
  • 2026年实测10款AI智能降重工具推荐:免费与付费全对比,毕业论文降低ai率必看
  • 超越教程:用UE4 Niagara模块化思维,拆解并重组你的爆炸、火焰与烟雾特效
  • 2026年成都镀锌楼承板厂家TOP5排行与选型指南:‌成都彩钢瓦厂家电话/‌成都彩钢瓦厂家直销电话/‌成都组合楼承板厂家推荐/选择指南 - 优质品牌商家
  • 2026年重庆保姆推荐榜单:住家保姆/白班保姆/半天保姆/全天保姆/照顾老人与小孩保姆公司深度解析与优质服务之选 - 品牌企业推荐师(官方)
  • 2026 成都卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科
  • Adobe-GenP 3.0破解工具:设计师的创意自由之门
  • 【MySQL高阶】20.InnoDB 磁盘文件
  • TestDisk与PhotoRec:开源数据恢复双雄的终极完整指南
  • 什么叫无状态