2012-10-31 29 views
0

我遇到這個在這裏和那裏,我總是圍繞着它的工作,但我只是知道。
這是一個數組,一個對象,或??? (比方說,我通過var_export($co)得到這個)PHP:這是什麼對象類型,以及如何添加到它,而不會導致警告

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." 
} 

回答

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()

更好的訪問修飾符你能澄清一下你得到的警告是什麼的問題是有關的,我將修改我的答案,讓相關你在問什麼

+0

感謝,說明已經被添加到這個問題:) – mOrloff

1

$costdClass類型的對象。你可以創建一個,只要你想添加儘可能多的性能沒有任何警告:

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

你所面臨的警告是最有可能Creating default object from null value,這意味着你要轉讓財產未初始化的變量。

對於stdClass對象,您不應該嘗試運行由var_export生成的代碼,因爲它們沒有方法__setState

+0

我得到的警告是有一點不同,目前已經加入到這個問題。非常感謝您的幫助。 – mOrloff

+0

@mOrloff所以'$ co'不是一個對象,也不是null - 在分配新屬性之前嘗試'var_dump($ co)'來查看它是什麼類型的變量。 –

+0

它在循環中,所以當它不是一個對象時可以進行迭代。在嘗試分配新屬性之前,用'is_object($ co)'檢查它。 –

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'; 
+0

什麼真的沒有你的問題是觸發警告的代碼... – Sven

+0

它在那裏...當我嘗試像'$ co-> owner ='Wiley Coyote''這樣的警告(警告始終引用這樣一個任務的確切行號)時觸發錯誤。任何其他問題/想法? – mOrloff

+0

那麼,我不能重現。 – Sven

相關問題