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 为空值。如果是新团队,则改为传递该空对象。
我目前正在 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 为空值。如果是新团队,则改为传递该空对象。