PHP:这个对象类型是什么,如何在不引起警告的情况下添加它

时间:2012-10-31 22:34:23

标签: php object spl

我在这里和那里遇到过这种情况,我总是在处理它,但我只是 得到 知道。
这是一个数组,一个对象,还是??? (假设我通过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]

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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()

你能说清楚你得到的警告是什么以及问题是什么,我会编辑我的答案,使其与你所要求的内容相关

答案 2 :(得分: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';