有许多类似的问题,但是这有点不同,因为它涉及深层对象属性访问,而不仅仅是一个深度级别.
假设我有一个包含字符串的变量foo.bar.
$user = new User();
$user->foo = new Foo();
$user->foo->bar = "Hello World";
$variable = "foo.bar"
Run Code Online (Sandbox Code Playgroud)
我想响应$user->foo->bar通过利用$variable:
echo $user->foo->bar
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止尝试但没有成功(它说NULL):
$value = str_replace(".", "->", $value);
echo $user->{$value};
Run Code Online (Sandbox Code Playgroud)
dec*_*eze 12
使用变量属性表示法()减少对象路径非常容易$o->$p:
$path = 'foo.bar';
echo array_reduce(explode('.', $path), function ($o, $p) { return $o->$p; }, $user);
Run Code Online (Sandbox Code Playgroud)
这很容易变成一个小辅助函数.
对@deceze 帖子添加了一些改进。
这允许处理您还需要通过数组的情况。
$path = 'foo.bar.songs.0.title';
echo array_reduce(explode('.', $path), function ($o, $p) { return is_numeric($p) ? $o[$p] : $o->$p; }, $user);
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您使用的是 PHP 7+,那么如果属性名称输入错误或不存在,则以下内容将安全地返回 null。
$path = 'foo.bar.songs.0FOOBAR.title';
echo array_reduce(explode('.', $path), function ($o, $p) { return is_numeric($p) ? ($o[$p] ?? null) : ($o->$p ?? null); }, $user);
Run Code Online (Sandbox Code Playgroud)