PHP - 如果对象存在则将参数传递给函数,否则默认为 null

PHP - Pass parameter to function if object exists, otherwise default to null

我目前正在 php 中开发表单生成器助手 class,其中包含添加各种类型字段(addTextfield()、addBooleanField() 等)的静态方法,其中目的是为每种对象类型使用一个模板,无论我是添加新对象还是编辑现有对象。

FormBuilder 的相关部分基本上是这样做的:

class FormBuilder {
    public static function addTextField($name, $default_value){
        echo "<input type='text' name='{$name}' value='{$default_value}'>";
    }
}

这里有一个虚拟的 class 用作示例

class Team {
    public $id;
    public $name;
    public $city;
}

因此,在编辑现有团队时,我将有一个 $team 变量来传递当前值。如果我要添加一个新团队,显然不会设置这些值,并且 $team 将不存在。我正在努力寻找一种有效的方法来传递当前值。到目前为止我发现的唯一成功的方法是:

<div>
    <span>Team Name</span>
    <?php FormBuilder::addTextField("name", (isset($team) ? $team->name: "")); ?>
</div>
<div>
    <span>City</span>
    <?php FormBuilder::addTextField("city", (isset($team) ? $team->city: "")); ?>
</div>

其中一些表格会变得非常大,因此为每个表格添加 isset($item) ? $item->prop : "" 并不理想。

还可以选择在模板的开头定义一个 $defaults 数组,具体取决于项目是否存在,但这同样会留下一些错误空间

创建团队的虚拟实例 class 不是一个选项,因为如果在数据库中找不到有效实例,对象会抛出错误。

我尝试将方法中的参数更改为 &$default_value,但这会阻止我直接传递值,我偶尔需要这样做。

我觉得我可能对代码提出了太多要求,但目的是尽可能少地重复一些事情。

如有任何帮助,我们将不胜感激!

以下情况如何:

addTextFieldFromEntity($name, $entity = null, $entityField = null)

然后:

<?php FormBuilder::addTextFieldFromEntity("name", $team, "name"); ?>

或者更复杂的东西:

class EntityWrapper
{
    private $entity;

    public static function init($entity)
    {
        return new EntityWrapper($entity);
    }

    public function __construct($entity)
    {
        $this->entity = $entity;
    }

    public function __get($name)
    {
        if (!is_null($this->entity)) {
            return '';
        }

        return $this->entity->$name;
    }
}

然后:

<?php FormBuilder::addTextField("name", EntityWrapper::init($team)->name); ?>

使用 https://en.wikipedia.org/wiki/Null_object_pattern 怎么样? 让 return 为空值。如果是新团队,则改为传递该空对象。