【问题标题】:PHP: What is this object type, and how do I add to it without causing warningsPHP:这个对象类型是什么,以及如何添加它而不引起警告
【发布时间】:2012-10-21 12:42:55
【问题描述】:

我到处都遇到过这个问题,我一直在解决它,但我只是必须知道。
这是一个数组,一个对象,还是??? (假设我是通过var_export($co) 得到的)

stdClass::__set_state(array(
   'name' => 'Acme Anvil Corp.',
))

最重要的是,如何为其添加价值?
假设我想添加一个值,例如$co->owner = 'Wiley Coyote'。这总是会引发警告。

怎么做?
什么?

好奇心简直要了我的命:)

[编辑]
作为澄清,我想我的问题的根源是“如何在不触发警告的情况下向对象添加变量?”

这是我经常收到的警告:

遇到 PHP 错误
严重性:警告
消息:尝试分配非对象的属性

var_dump($co) 产生:(当前在循环中完成,如果相关的话)

object(stdClass)#185 (1) {
  ["name"]=>
  string(16) "Acme Anvil Corp."
}

[/EDIT]

【问题讨论】:

    标签: php object spl


    【解决方案1】:

    $costdClass 类型的对象。您可以创建一个并添加任意数量的属性,而不会发出任何警告:

    $obj = new stdClass();
    $obj->prop1 = 'val1';
    $obj->prop2 = 3.14;
    

    您面临的警告很可能是Creating default object from null value,这意味着您正在尝试将属性分配给未初始化的变量。

    您不应该尝试运行由var_exportstdClass 对象生成的代码,因为它们没有方法__setState

    【讨论】:

    • 我得到的警告有点不同,现在已添加到问题中。非常感谢您的帮助。
    • 它在循环中,所以当它不是一个对象的时候可以有迭代。在尝试分配新属性之前,请使用 is_object($co) 检查它。
    • 循环不在$co 本身,而是在包含 Co ID 的数据集上。 该循环中,ID 用于获取 Co 名称。这个$co 对象是该查询的结果。 (顺便说一句,我正在使用 CodeIgniter activerecord)。
    • 我只是说在这个循环中 $co 正在被覆盖。如果没有产生此警告的代码,很难说其他任何事情。
    【解决方案2】:

    不太确定您的错误 - 但 stdClass 类是 PHP 内置类的默认值。

    它基本上是一个空对象

    您应该可以使用$class->foo = 'bar' 设置属性

    如果您不是在谈论 stdClass - 但事实上您在 var_export 中获得了一个数组 - 它只是内部对象状态的表示。

    class Foo
    {
        private $bar = 'baz';
    }
    
    $foo = new Foo();
    
    var_export($foo);
    

    应该给出类似于

    的输出
    Foo::__set_state(array(
       'bar' => 'baz',
    ))
    

    您收到的警告可能是由于财产受到保护/私有。

    var_dump() 通常比var_export() 更能告诉你关于内部对象的访问修饰符

    您能否说明您收到的警告是什么以及问题是关于什么的,我将编辑我的答案以使其与您的要求相关

    【讨论】:

    • 谢谢,问题已添加说明:)
    【解决方案3】:

    var_export() 打印可执行的 PHP 代码,能够重新创建导出的变量。

    当遇到对象时,它们总是被导出为对其静态魔法方法__set_state() 的调用。与其他魔术方法相比,这个方法并没有太多的魔力,除了 var_export 保证用这个方法创建静态调用,所以它只是这种方法的约定名称。

    类的__set_state() 方法应返回对象的实例,其中所有导出的属性都设置为数组参数给定的值。

    例子:

    class Foo {
      public $bar;
    
      public static function __set_state($params) {
        $obj = new Foo;
        foreach ($params as $key => $value) {
          $obj->$key = $value;
        }
        return $obj;
      }
    }
    
    $foo = new Foo;
    $foo->bar = "Hello World";
    

    var_export($foo);

    这会打印如下内容:

    Foo::__set_state(array('bar' => 'Hello World'));
    

    如果您执行此操作并再次将其保存到变量中:

    $x = Foo::__set_state(array('bar' => 'Hello World'));
    

    它将重新创建具有所有给定属性集的对象。

    它不适用于 stdClass 对象,因为它们没有 __set_state() 方法。

    请参阅http://de3.php.net/manual/en/language.oop5.magic.php#object.set-state 了解更多信息。

    更新:

    此代码不会触发任何警告:

    ini_set('display_errors', 1);
    error_reporting(E_ALL | E_STRICT);
    
    $co = new stdClass();
    
    $co->name = 'Acme Anvil Corp.';
    
    var_export($co);
    
    $co->owner = 'Wiley Coyote';
    

    【讨论】:

    • 它就在那里......当我尝试像$co->owner = 'Wiley Coyote' 这样的东西时会触发错误(警告总是引用这种分配的确切行号)。还有其他问题/想法吗??
    • 好吧,我无法重现。
    猜你喜欢
    • 2011-12-14
    • 2015-06-26
    • 1970-01-01
    • 2021-10-15
    • 2021-10-20
    • 2015-01-27
    • 2023-02-23
    • 2021-09-13
    • 2020-12-15
    相关资源
    最近更新 更多