PHP构造方法定义默认值为数组的属性时如何减少重复代码?
方案1:使用PHP数组简写语法(适配PHP 5.4及以上版本)
直接把所有array()替换为PHP支持的短数组语法[],就能直接缩短一半的默认值代码长度,同时完全保留你现在用的构造器属性提升写法:
class User { public function __construct( private $groupData = [], private $nameData = [], private $nameSData = [], private $OData = [], private $uwoData = [], private $lReq = [], private $lReqB = [], private $lReqC = [], private $nameMData = [], private $typeData = [], private $equipamiento = [], private $equip = [], private $brandData = [], private $provData = [], private $typeData2 = [], private $lSol = [], private $lSolP = [], private $officS = [], private $officeG = [], private $lReqFO = [], private $reporta_fallo = [], private $rFallo = [], private $lFalloFO = [], private $sTypeData = [], private $equipFID = [], private $lReqPFO = [], private $lFalloPFO = [], private $lEquipFO = [], private $lSolSP = [], private $lSolS = [], private $lSolFID = [], private $lReqCID = [], private $OSData = [], private $equipFAO = [], private $officeFS = [], private $lReqSA = [], private $lReqA = [], private $lTypeFID = [], private $lReqCA = [], private $lTypeS = [], private $depData = [], private $lNext = [], private $lReqBA = [] ) {} }
方案2:使用公共属性容器(大幅减少代码量)
如果这些属性都是普通业务存储字段,不需要单独做特殊逻辑限制,完全可以收敛到一个数组成员里,不需要逐个声明属性:
class User { // 所有数组属性统一存储在容器中 private array $attributes = []; public function __construct(array $attributes = []) { $this->attributes = $attributes; } // 统一读取属性,不存在自动返回空数组 public function getAttribute(string $name): array { return $this->attributes[$name] ?? []; } // 统一设置属性 public function setAttribute(string $name, array $value): self { $this->attributes[$name] = $value; return $this; } }
使用时调用$user->getAttribute('groupData')即可获取对应值,没有赋值的属性会自动返回空数组,不需要额外判断。
方案3:类型属性声明默认值(适配PHP 7.4及以上版本)
如果你需要保留单独的属性声明,也可以把默认值放在属性声明阶段,构造函数里只放需要主动传参覆盖的参数即可:
class User { // 所有属性声明时直接设置默认空数组 private array $groupData = []; private array $nameData = []; private array $nameSData = []; // 其他属性以此类推... public function __construct( // 构造函数里只写需要外部传参修改的属性即可,不需要改默认值的不用声明 ?array $groupData = null, ?array $nameData = null ) { if ($groupData !== null) $this->groupData = $groupData; if ($nameData !== null) $this->nameData = $nameData; } }
内容的提问来源于stack exchange,提问作者GLPG35
相关产品推荐
相关产品推荐

