一、簡介
在PHP中,對象比較是一個比較復(fù)雜的過程。首先,當(dāng)使用比較運算符(==)來比較兩個對象變量時,比較的原則是:如果兩個對象的屬性和屬性值都相等,而且這兩個對象都是同一個類的實例,那么這兩個對象變量就被認為是相等的。
如果使用全等運算符(===),則這兩個對象變量不僅要有相同的屬性和屬性值,還要指向某個類的同一個實例,即它們必須是同一個對象。
當(dāng)進行對象比較時,PHP不會自動進行類型轉(zhuǎn)換。例如,如果比較的兩個操作對象都是數(shù)字字符串,或者一個是數(shù)字另一個是數(shù)字字符串,PHP會按照數(shù)值進行比較。但如果比較使用的是 === 或 !== 運算符,則不會進行類型轉(zhuǎn)換——因為此時不僅要對比數(shù)值,還要對比類型。
二、實例
通過下面的示例可以理解以上原則。對象比較的例子:
<?php function?bool2str($bool) { ????if?($bool?===?false)?{ ????????return?'FALSE'; ????}?else?{ ????????return?'TRUE'; ????} } function?compareObjects(&$o1,?&$o2) { ????echo?'o1?==?o2?:?'?.?bool2str($o1?==?$o2)?.?"\n"; ????echo?'o1?!=?o2?:?'?.?bool2str($o1?!=?$o2)?.?"\n"; ????echo?'o1?===?o2?:?'?.?bool2str($o1?===?$o2)?.?"\n"; ????echo?'o1?!==?o2?:?'?.?bool2str($o1?!==?$o2)?.?"\n"; } class?Flag { ????public?$flag; ????function?__construct($flag?=?true)?{ ????????$this->flag?=?$flag; ????} } class?OtherFlag { ????public?$flag; ????function?__construct($flag?=?true)?{ ????????$this->flag?=?$flag; ????} } $o?=?new?Flag(); $p?=?new?Flag(); $q?=?$o; $r?=?new?OtherFlag(); echo?"Two?instances?of?the?same?class\n"; compareObjects($o,?$p); echo?"\nTwo?references?to?the?same?instance\n"; compareObjects($o,?$q); echo?"\nInstances?of?two?different?classes\n"; compareObjects($o,?$r); ?>
以上示例會輸出:
Two?instances?of?the?same?class o1?==?o2?:?TRUE o1?!=?o2?:?FALSE o1?===?o2?:?FALSE o1?!==?o2?:?TRUE Two?references?to?the?same?instance o1?==?o2?:?TRUE o1?!=?o2?:?FALSE o1?===?o2?:?TRUE o1?!==?o2?:?FALSE Instances?of?two?different?classes o1?==?o2?:?FALSE o1?!=?o2?:?TRUE o1?===?o2?:?FALSE o1?!==?o2?:?TRUE
以上代碼定義了兩個類:Flag 和 OtherFlag,以及一個用于比較對象是否相等的函數(shù) compareObjects。
- Flag 類有一個屬性 $flag,默認值為 true。
- OtherFlag 類也有一個屬性 $flag,默認值為 true。
- compareObjects 函數(shù)接受兩個引用參數(shù) $o1 和 $o2,分別表示兩個對象。函數(shù)內(nèi)部使用 bool2str 函數(shù)將比較結(jié)果轉(zhuǎn)換為字符串并輸出。bool2str 函數(shù)接受一個布爾值參數(shù) $bool,如果 $bool 為
- false,則返回 ‘FALSE’,否則返回 ‘TRUE’。在主程序中,創(chuàng)建了四個對象:o、o、p、$q 和 r。其中,r。其中,o 和 p 是 Flag 類的實例,p是Flag類的實例,q 是 o 的引用,o的引用,r 是 OtherFlag 類的實例。
- 調(diào)用 compareObjects 函數(shù)分別比較這四個對象。首先比較 $o 和 $p,然后比較 $o 和 $q,最后比較 $o 和 $r。在每次比較后,都會輸出比較結(jié)果。
注意:PHP 擴展中可以自行定義對象比較(==)的原則。