PHP中如何通过含层级键的变量调用类属性?
PHP中通过层级字符串访问对象属性的解决方案
问题场景
现有如下PHP代码:
$testvar1 = "paymentTerms->daysOfCredit"; $testvar2 = "orderNumber"; echo $input_obj->collection[0]->paymentTerms->daysOfCredit; // 返回8 echo $input_obj->collection[0]->orderNumber; // 返回159 echo $input_obj->collection[0]->{$testvar1}; // 无返回,预期返回8 echo $input_obj->collection[0]->{$testvar2}; // 返回159
直接使用{$testvar1}无法获取预期值,原因是PHP不会自动解析字符串中的->层级,它会把整个字符串当作单一属性名查找,而目标对象中并不存在名为paymentTerms->daysOfCredit的属性。
可行解决方案:使用explode结合简化代码
可以通过explode()将层级字符串拆分为属性数组,再逐层遍历访问对象属性。以下是两种简洁的实现方式:
方式一:使用array_reduce简化遍历
function getNestedProperty($obj, $path) { return array_reduce(explode('->', $path), function($current, $prop) { return $current->$prop ?? null; }, $obj); } // 使用示例 echo getNestedProperty($input_obj->collection[0], $testvar1); // 输出8 echo getNestedProperty($input_obj->collection[0], $testvar2); // 输出159
方式二:箭头函数简写(PHP 7.4+)
如果你的PHP版本支持箭头函数,可进一步简化代码:
$getProp = fn($obj, $path) => array_reduce(explode('->', $path), fn($c, $p) => $c->$p ?? null, $obj); // 使用示例 echo $getProp($input_obj->collection[0], $testvar1); // 输出8
这两种方法都能有效处理多层级属性路径,同时代码简洁易读。
内容的提问来源于stack exchange,提问作者Albert van Harten
相关产品推荐
相关产品推荐

