我在这里和那里遇到过这种情况,我总是在处理它,但我只是 得到 知道。
这是一个数组,一个对象,还是??? (假设我通过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]
答案 0 :(得分:1)
$co
是stdClass
类型的对象。您可以创建一个并根据需要添加任意数量的属性,而不会发出任何警告:
$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';