PHP 中的 stdClass 是什么?有什么作用?
對(duì)于 stdclass 官方文檔介紹它是具有動(dòng)態(tài)屬性的通用空類。此類的對(duì)象可以使用 new 實(shí)例化,也可以通過類型轉(zhuǎn)換為對(duì)象創(chuàng)建。幾個(gè) PHP 函數(shù)也會(huì)創(chuàng)建此類的實(shí)例,比如 json_decode()、mysqli_fetch_object() 或 PDOStatement::fetchObject()。
通俗的說,他就是PHP中的空類,用于將其他類型轉(zhuǎn)換為對(duì)象。比如數(shù)組,字符串等轉(zhuǎn)換成一個(gè)自定義的對(duì)象,常見的有json_decode(),將字符串json格式的數(shù)據(jù)轉(zhuǎn)換成一個(gè)對(duì)象形式。
下面我針對(duì)不同使用場(chǎng)景來分析一下stdclass。
1. 數(shù)據(jù)存儲(chǔ)
PHP開發(fā)過程中存儲(chǔ)數(shù)據(jù)用的最多的時(shí)數(shù)組,但是我們還可以使用對(duì)象來存儲(chǔ)。如果不想自己自定義一個(gè)類,來存儲(chǔ)數(shù)據(jù),就可以使用 stdclass
(1) 數(shù)組存儲(chǔ)
// 定義數(shù)組存儲(chǔ)個(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) 對(duì)象存儲(chǔ)
$personal_object = newstdClass();
$personal_object->name = "Tinywan";
$personal_object->home = "www.tinywan.com";
$personal_object->address = "ZheJiang HangZhou";
// 顯示對(duì)象內(nèi)容
print_r($personal_object);
注意:這里定義的對(duì)象,可以動(dòng)態(tài)增加屬性
輸出結(jié)果如下:
stdClass Object
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)
當(dāng)然,數(shù)組和stdclass之間是可以互相轉(zhuǎn)換。數(shù)組轉(zhuǎn)stdclass對(duì)象非常方便,直接使用(object)進(jìn)行強(qiáng)轉(zhuǎn)即可:
$personal_array = [
"name" => "Tinywan",
"home" => "www.tinywan.com",
"address" => "ZheJiang HangZhou"
];
$personal_object = (object) $personal_array;
// 顯示對(duì)象內(nèi)容
print_r($personal_object);
輸出內(nèi)容:
stdClass Object
(
[name] => Tinywan
[home] => www.tinywan.com
[address] => ZheJiang HangZhou
)
對(duì)象轉(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對(duì)象的基類
這里需要注意的是,盡管是泛型類,stdClass 并不是 PHP 中對(duì)象的基類,我們可以使用 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() 是專門用于對(duì) JSON 字符串執(zhí)行操作的函數(shù)。json_encode() 用于將 Array 轉(zhuǎn)換為 JSON 字符串 。因此,首先,我們將一個(gè)對(duì)象轉(zhuǎn)換為 JSON 字符串,然后使用 json_decode() 將其轉(zhuǎn)換為對(duì)象。
$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
)
)