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

时间:2018-05-15 12:13:34

标签: php formbuilder

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

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

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

这里有一个虚拟类作为例子

$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> 变量来传递当前值。如果我要添加一个新团队,显然这些值不会被设置,并且$ team不会存在。我正努力寻找一种传递当前价值的有效方法。我到目前为止唯一成功的方法是:

isset($item) ? $item->prop : ""

其中一些表单会变得非常大,因此为每个表单添加$defaults并不理想。

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

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

我尝试将方法中的参数更改为{{1}},但这会阻止我直接传入值,偶尔我需要这样做。

我觉得我可能会问太多的代码,但目的是尽可能少地重复这些代码。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

以下内容如何:

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); ?>

答案 1 :(得分:0)

如何使用https://en.wikipedia.org/wiki/Null_object_pattern? 让它返回空值。如果是新团队,则改为传递该空对象。