我正在编写一段数据处理代码,通常必须将目标对象的属性设置为源对象的属性值,但前提是该属性存在于源对象中,如下所示: / p>
if (property_exists($source, 'something')) {
$target->other = $source->something;
}
(我不使用isset()
因为null
值也应该传递。)
重复上述代码将是一件痛苦的事。现在我正在使用此功能来执行此操作:
function set_if_exists($target, string $targetProperty, $source, string $sourceProperty)
{
if (property_exists($source, $sourceProperty)) {
$target->$targetProperty = $source->$sourceProperty;
}
}
上面的示例将是
set_if_exists($target, 'other', $source, 'something');
有没有办法实现相同而不必将属性命名为字符串?理想情况下,我希望能够做到像
这样的事情set_if_exists($target->other, $source->something);
但我不知道如何实现这一目标。它甚至可能吗?
答案 0 :(得分:0)
array_key_exists
仅适用于数组,您正在使用对象。您应该使用property_exists
函数来了解对象是否具有特定属性。
您无法以您希望的方式执行此操作,因为不存在的属性将始终返回null
,因此无法从该值知道该属性是否存在。
答案 1 :(得分:0)
我的结论是,这是不可能的。在PHP中似乎没有任何机制允许您检查是否存在(可能很深的)属性,isset()
内置或??
的方式。