【问题标题】:Random data container using magic methods __get and __set使用魔术方法 __get 和 __set 的随机数据容器
【发布时间】:2015-04-06 17:37:43
【问题描述】:

是否有可能创建一个 PHP 类,它可以使用魔术方法保存任何类型的数据,甚至是递归的?

我看到了这个:PHP - Indirect modification of overloaded property

但它不处理递归数据:

class ActiveRecord extends Creator {

}

$a = new ActiveRecord();

$a->_id = "123456789";
$a->persona_info = [
    "name" => "Bob",
    "surnames" => ["First", "Second", "Third"]
];
$a->history = [
    "logins" => [
        [
            "date" => "1999",
            "ip" => "1.2.3.4"
        ],
        [
            "date" => "1129",
            "ip" => "1.2.3.4"
        ]
    ],
    "purchases" => [
        [
            "date" => "1819",
            "amount" => "1884"
        ],
        [
            "date" => "1459",
            "amount" => "14"
        ]
    ]
];

var_dump($a->history->logins);

这给了我:

PHP Notice:  Trying to get property of non-object in /tmp/x.php on line 90
PHP Stack trace:
PHP   1. {main}() /tmp/x.php:0
NULL

为了进一步调查,我发现 $a->history 是一个普通的 php 数组,而不是 Value 对象(甚至是 Creator 对象。

【问题讨论】:

  • 你也应该发布Creator
  • @DarkBee 在我的问题的链接中。
  • 不要认为大多数人倾向于点击。初看没看,反正你用的是creator类的修改版?
  • 你需要返回另一个也有魔法方法的对象,而不是原始数组。
  • @Barmar 那应该在哪里?在Value__get方法中?

标签: php containers magic-methods


【解决方案1】:

问题是$a->historyarray 而不是object。应该是var_dump($a->history['logins']);

【讨论】:

  • 是的,这适用于这种特定情况,但我的问题更广泛。我正在尝试使用-> 访问值,这意味着每个值都应该是一个对象,然后应该包含所有子值等。
  • 这就是问题所在。如果你想让它成为一个对象,那么你需要以不同的方式声明它,而不是那样。
  • OP 正在使用魔术方法来修改传递的数据,在这种情况下将数组转换为StdClass,请参阅链接答案
猜你喜欢
  • 2011-06-10
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多