0

我在这里和那里遇到过这个问题,我一直在解决它,但我只是想知道。
这是一个数组,一个对象,还是???(假设我是通过这个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."
}

[/编辑]

4

3 回答 3

1

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

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

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

您不应该尝试运行var_exportforstdClass对象生成的代码,因为它们没有 method __setState

于 2012-10-31T22:42:50.240 回答
0

不太确定您的错误 - 但 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()

你能澄清你收到的警告是什么以及问题是什么,我会编辑我的答案以使其与你的要求相关

于 2012-10-31T22:40:41.033 回答
0

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';
于 2012-11-01T00:47:01.733 回答