PHP 中的 stdClass 是什么?有什么作用?
對于 stdclass 官方文檔介紹它是具有動態(tài)屬性的通用空類。此類的對象可以使用 new 實(shí)例化,也可以通過類型轉(zhuǎn)換為對象創(chuàng)建。幾個(gè) PHP 函數(shù)也會創(chuàng)建此類的實(shí)例,比如 json_decode()、mysqli_fetch_object() 或 PDOStatement::fetchObject()。
通俗的說,他就是PHP中的空類,用于將其他類型轉(zhuǎn)換為對象。比如數(shù)組,字符串等轉(zhuǎn)換成一個(gè)自定義的對象,常見的有json_decode(),將字符串json格式的數(shù)據(jù)轉(zhuǎn)換成一個(gè)對象形式。

下面我針對不同使用場景來分析一下stdclass。
1. 數(shù)據(jù)存儲
PHP開發(fā)過程中存儲數(shù)據(jù)用的最多的時(shí)數(shù)組,但是我們還可以使用對象來存儲。如果不想自己自定義一個(gè)類,來存儲數(shù)據(jù),就可以使用 stdclass
(1) 數(shù)組存儲
// 定義數(shù)組存儲個(gè)人信息
$personal_array = [
"name" => "Tinywan",
"home" => "www.tinywan.com",
"address" => "ZheJiang HangZhou"
];
// 顯示數(shù)組內(nèi)容
print_r($personal_array);輸出結(jié)果如下:
Array
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)(2) 對象存儲
$personal_object = newstdClass();
$personal_object->name = "Tinywan";
$personal_object->home = "www.tinywan.com";
$personal_object->address = "ZheJiang HangZhou";
// 顯示對象內(nèi)容
print_r($personal_object);注意:這里定義的對象,可以動態(tài)增加屬性
輸出結(jié)果如下:
stdClass Object
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)當(dāng)然,數(shù)組和stdclass之間是可以互相轉(zhuǎn)換。數(shù)組轉(zhuǎn)stdclass對象非常方便,直接使用(object)進(jìn)行強(qiáng)轉(zhuǎn)即可:
$personal_array = [
"name" => "Tinywan",
"home" => "www.tinywan.com",
"address" => "ZheJiang HangZhou"
];
$personal_object = (object) $personal_array;
// 顯示對象內(nèi)容
print_r($personal_object);輸出內(nèi)容:
stdClass Object
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)對象轉(zhuǎn)數(shù)組也是一樣的:
$personal_object = newstdClass();
$personal_object->name = "Tinywan";
$personal_object->home = "www.tinywan.com";
$personal_object->address = "ZheJiang HangZhou";
$personal_array = (array) $personal_object;
// 顯示數(shù)組內(nèi)容
print_r($personal_array);輸出內(nèi)容:
Array
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)2. stdclass不是PHP對象的基類
這里需要注意的是,盡管是泛型類,stdClass 并不是 PHP 中對象的基類,我們可以使用 instanceof 關(guān)鍵字來證明這一點(diǎn)。
classTinywan{
}
$objClass = newTinywan();
if ($objClass instanceof\stdClass){
echo'Yes';
} else {
echo'No';
}輸出結(jié)果:No
結(jié)果證明,stdclass并不是PHP的基類。
3. json_encode() 、 json_decode()與stdclass的關(guān)系
json_encode() 和 json_decode() 是專門用于對 JSON 字符串執(zhí)行操作的函數(shù)。json_encode() 用于將 Array 轉(zhuǎn)換為 JSON 字符串 。因此,首先,我們將一個(gè)對象轉(zhuǎn)換為 JSON 字符串,然后使用 json_decode() 將其轉(zhuǎn)換為對象。
$empInfo = array(
'name'=>'John',
'address'=>'Houston',
'employment' => array(
'id' => '1',
'address' => 'Los Angeles'
)
);
print_r(json_decode(json_encode($empInfo)));輸出結(jié)果如下:
stdClass Object
(
[name] => John
[address] => Houston
[employment] => stdClass Object
(
[id] => 1
[address] => Los Angeles
)
)


























