当前位置: 首页 > 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.zskr.cn/news/1456915.html

相关文章:

  • 微信小程序直连阿里云IoT控制家电+实时显示温湿度/PM2.5数据源码
  • 模型准确率下降却无告警?——用3类动态基线+5维监控维度重建AI可信度防线
  • 降AIGC黑科技揭秘!AI率92%暴降至5%!实测10款降AIGC平台!免费额度狂薅攻略
  • 2026年速冻蔬菜批发供应商推荐榜单:南通/海门/江苏出口级IQF BQF速冻蔬菜,预制菜食堂餐饮及日产能140吨优质厂家精选 - 品牌企业推荐师(官方)
  • AI工具如何真正接管排班?揭秘头部企业已验证的7步集成路径与ROI提升217%的关键数据
  • 出海物联网设备全球网络准入架构:基于Python的自动APN适配与链路保活实战
  • 如何在电脑上轻松编辑PDF | 最新指南
  • 超越教程:用UE4 Niagara模块化思维,拆解并重组你的爆炸、火焰与烟雾特效
  • 2026年成都镀锌楼承板厂家TOP5排行与选型指南:‌成都彩钢瓦厂家电话/‌成都彩钢瓦厂家直销电话/‌成都组合楼承板厂家推荐/选择指南 - 优质品牌商家
  • 2026年实测10款AI智能降重工具推荐:免费与付费全对比,毕业论文降低ai率必看
  • 2026 成都卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科
  • Adobe-GenP 3.0破解工具:设计师的创意自由之门
  • 2026水族灯什么牌子好:马印凭光谱可调与国际赛事背书进入推荐候选 - 观域传媒
  • XCOM 2模组管理器AML终极指南:告别模组冲突的烦恼
  • 2026 惠州卫生间漏水、外墙、楼顶、地下室、阳光房渗漏维修师傅推荐|同城附近上门防水补漏公司测评 - 防水百科
  • 3个关键问题+5个核心功能:为什么GanttProject是免费开源项目管理的最佳选择?
  • Win11Debloat终极瘦身指南:如何免费快速清理Windows系统臃肿
  • RabbitMQ 从入门到实战!一文搞懂核心交换机 + Spring Boot 整合,附完整代码
  • 维普查重愈发严苛,适配维普的 AI 论文写作工具怎么挑选?【2026 深度盘点实测指南】
  • PHY电压对网变内部CMC位置的“隐形指挥”
  • 3分钟快速上手:零基础打造你的AI游戏瞄准助手终极指南
  • 基于分布式智能采样与MRF推理的隐私保护交通感知系统
  • 2026年 搪瓷钢板厂家优选榜单:地铁站/隧道/隔音/外墙/双曲弧/木纹/电镀/穿孔搪瓷钢板源头品牌深度解析 - 品牌企业推荐师(官方)
  • 别再让YOLOv8自动选模型了!手把手教你自定义best.pt的评判标准(附权重修改代码)
  • 【AI推荐系统实战指南】:20年专家亲授5大AI工具与推荐引擎无缝整合的黄金法则
  • 5分钟搞定抖音内容保存:这个开源工具让你轻松收藏喜欢的视频和直播
  • 大气层自定义固件:释放Nintendo Switch全部潜力的开源解决方案
  • 从零到精通:Jellyfin MetaShark插件完整配置与故障排除指南
  • 2026年大型空调主机拆除靠谱公司排名 - myqiye
  • 终极指南:如何使用Attu轻松管理你的Milvus向量数据库