PHP中如何多次链式调用同一方法?表单构建场景疑问
解决表单构建器链式调用覆盖状态的问题
问题根源
你的FormInputBuilder类用单个字符串属性$label存储生成的输入框HTML,每次调用addInput时都会直接覆盖这个属性的值,所以链式调用后只会保留最后一次调用的结果。
解决方法
修改类的实现,用数组存储所有生成的输入框片段,而非单个字符串:
修改后的类代码
class FormInputBuilder implements FormInputInterface { // 将单个字符串属性改为数组,存储所有输入框HTML片段 public $inputs = []; public function addInput( string $inputType, string $placeholder, string $inputName, string $label = '', string $inputCssClasses = '', string $labelCssClasses = '' ) { $inputHtml = ''; if ($label !== '') { $inputHtml .= sprintf("<label for='%s'>%s</label>", $inputName, $label); } $inputHtml .= sprintf( "<input type='%s' name='%s' placeholder='%s' class='%s'>", $inputType, $inputName, $placeholder, $inputCssClasses ); // 将生成的HTML追加到数组,而非覆盖原有值 $this->inputs[] = $inputHtml; return $this; } // 可选:添加方法返回所有输入框拼接后的完整HTML public function getFullHtml(): string { return implode('', $this->inputs); } }
修改后的调用代码
$formBuilder = new FormInputBuilder(); $formBuilder ->addInput( inputType: 'text', placeholder: '', inputName: 'address', label: 'address', inputCssClasses: 'd-block' ) ->addInput( inputType: 'text', placeholder: 'test2', inputName: 'age', label: 'age', inputCssClasses: 'd-block' ); // 获取所有输入框的HTML片段数组 $elements = $formBuilder->inputs; // 或者直接获取拼接好的完整HTML $fullFormHtml = $formBuilder->getFullHtml(); dump($elements); // 现在会包含address和age两个输入框的HTML内容
额外说明
- 如果你需要链式调用时每次都能拿到单个输入框的实例,可以让
addInput返回新的FormInputBuilder对象,但这种方式不符合常规构建器模式的设计逻辑。 - 用数组存储片段的方式更灵活,后续可以方便地对单个输入框进行修改、排序或自定义渲染。
内容的提问来源于stack exchange,提问作者Piotr979
相关产品推荐
相关产品推荐

