关于虚拟字段的Hooked/只读属性的实现咨询
关于虚拟字段的Hooked/只读属性的实现咨询
嘿,我之前好几次碰到这种场景:有个父类得靠子类里的**不可变(也就是现在咱们说的readonly)**值来生成一个「虚拟字段」,这些值都是没法修改的。
之前我是这么写的:
<?php abstract class Person { public function getFullName(): string { return $this->getFirstName() . ' ' . $this->getLastName(); } // 父类会定义抽象的getFirstName和getLastName方法,强制子类实现 }
(注:原代码看起来有点截断,我补全了方法的闭合部分)
这种写法的核心就是父类通过调用子类必须实现的只读属性获取方法,拼接出虚拟字段的值。因为子类里的这些值是不可变的,所以每次调用getFullName()得到的结果都一致,完全不用担心值被意外篡改的问题。
如果想贴合现代PHP的特性,其实还可以用readonly属性配合抽象属性的方式来实现,代码会更简洁:
<?php abstract class Person { abstract public readonly string $firstName; abstract public readonly string $lastName; public function getFullName(): string { return $this->firstName . ' ' . $this->lastName; } } class User extends Person { public readonly string $firstName; public readonly string $lastName; public function __construct(string $firstName, string $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; } }
这样子类的属性是严格只读的,父类直接访问属性就能生成虚拟字段,逻辑更清晰,也符合现在PHP的最佳实践~
内容来源于stack exchange
相关产品推荐
相关产品推荐

