如何在php中访问名为变量(点表示法)的深层对象属性?

Gia*_*mPy 5 php properties

有许多类似的问题,但是这有点不同,因为它涉及深层对象属性访问,而不仅仅是一个深度级别.

假设我有一个包含字符串的变量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)

这很容易变成一个小辅助函数.


asi*_*iby 5

对@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)