【问题标题】:How to Dynamically Access Objects in PHP如何在 PHP 中动态访问对象
【发布时间】:2020-04-09 14:54:19
【问题描述】:

我有两个具有多个字段的 stdClass 对象。我无法更改对象布局或结构。

例如,他们都有一个电话号码:

对象 A

[phone] => Array
(
[0] => stdClass Object
(
[value] => '+1 123 456 7890'
[primary] => 1
)
)

对象 B

[phone] => '+1 123 456 7890'

我想通过数据库条目动态访问它们。换句话说,要访问对象 B 中的“电话”,只需:

$objB->phone

在数据库中,我会将字段存储为“电话”,将此值分配给变量,例如$field 和代码是:

$objB->{"$field"}

但是,如果我想映射对象 A,就会出现问题。要访问电话值,我需要:

$objA->phone[0]->value

但是由于我有很多字段和很多映射,我如何动态设置对这些字段的访问权限?

假设我有一个类似的数据库条目:

phone.0.value

这可以很容易地翻译成:

$objA->{"$field1"}[$key]->$field2

但是在动态或嵌套情况下会发生什么,例如,另一个字段是:

email.company.0.value.0

我不知道动态访问此值的方法。换句话说,我如何才能为给定的数据库条目动态构建访问权限?

$objA->{"$field1"}->{"$field2"}[$key1]->$field3[$key2]

【问题讨论】:

  • 我曾经在堆栈溢出时问过这个问题。答案几乎没有。基本上你可以让你的应用程序要么是对象驱动的,要么是表驱动的,但不能两者兼而有之(至少不干净)。如果您不排序/过滤/加入,您可以使用对象样式数据库。如果你想使用排序/过滤/加入,你应该使用关联数组而不是对象。这是我能得到的最佳答案。
  • 有趣。您是否有任何问题的链接?谢谢!
  • 我在发布该评论后查看但找不到。我会再刺一次。它可能已作为重复或其他内容被删除。
  • 仍然找不到问题但发现了这个有趣的位:stackoverflow.com/questions/17421306/…
  • 我编辑了我的答案。请检查一下。

标签: php


【解决方案1】:

您可以为此创建一个函数:

function test($str, $c) {
    $res = $c;
    $array = explode('.', $str);
    foreach ($array as $item) {
        if (is_numeric($item)) {
            $res = $res[$item];
        } else {
            $res = $res->$item;
        }
    }
    return $res;
}
// $c is your \StdClass
echo test('email.company.0.value.0', $c);

【讨论】:

  • 谢谢,但这并不能回答问题。您的代码假设我事先知道我需要走多深/嵌套,并忽略了我可能有数组的事实。问题不在于访问,我知道该怎么做,而是我如何动态访问。
  • 谢谢,我审查了这个,它似乎可以按我的意愿工作。非常感谢编辑! :)
猜你喜欢
  • 2018-06-12
  • 2020-10-07
  • 2011-06-15
  • 2019-09-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多