在之前的文章中,我們講過PHP中比較陣列的時候發生了什么?,這次,我們來講講在物件比較的時候PHP是怎樣進行比較的,
首先,我們先根據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";
}
class A {
private $t = true;
public function setT($t){
$this->t = $t;
}
}
class B {
protected $t = true;
public function setT1($t){
$this->t = $t;
}
}
class C {
private $t = true;
public function setT($t){
$this->t = $t;
}
}
$a1 = new A();
$a2 = new A();
compareObjects($a1, $a2); // 相同的類
// o1 == o2 : TRUE
// o1 === o2 : FALSE
$a11 = $a1;
compareObjects($a1, $a11); // 相同的實體
// o1 == o2 : TRUE
// o1 === o2 : TRUE
$a11->setT(false);
compareObjects($a1, $a11); // 相同實體屬性值不同
// o1 == o2 : TRUE
// o1 === o2 : TRUE
$b = new B();
compareObjects($a1, $b); // 不同的類
// o1 == o2 : FALSE
// o1 === o2 : FALSE
$c = new C();
compareObjects($a1, $b); // 相同屬性不同的類
// o1 == o2 : FALSE
// o1 === o2 : FALSE
從例子中,我們可以看出基本都是符合上述三個條件的,不過需要注意的是,在===的情況下,如果是同一個實體物件,屬性值不同也會回傳TRUE,我們再通過一個更復雜的例子來觀察:
$c = new stdClass();
$d = new stdClass();
$c->t1 = 'c';
$c->t2 = 10;
$c->t3 = 50;
$d->t1 = 'c';
$d->t2 = 11;
$d->t3 = 40;
echo 'c > d:', $c > $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
$d->t2 = 10; // $t2屬性改成相等的
echo 'c > d:', $c > $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
$d->t3 = 50; // $c、$d屬性都相等了
echo 'c >= d:', $c >= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c <= d:', $c <= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c == d:', $c == $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c === d:', $c === $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
$c1 = clone $c; // 復制同一個物件
echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
$c1->t4 = 'f'; // 增加了一個屬性
echo 'c > c1:', $c > $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c < c1:', $c < $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
unset($c1->t4);
$c1->t1 = 'd'; // 修改了一個值
echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
這個例子中,我們進行了<、>的對比,在這種對比中,都是根據屬性值來進行比對的,而對比的順序也是屬性值的英文排序,當$t2有了不相等的比較結果時,$t3就不會再進行比對了,此外,clone之后的物件并不是原來的實體物件了,所以clone后的物件和原物件是無法用===來獲得相等的結果的,當一個物件的屬性比另一個物件多時,這個物件也會比屬性少的物件大,
物件的比較其實和陣列是有些類似的,但它們又有著些許的不同,一個重要的方面就是把握住它們都會進行屬性比較,另外還有就是=的差別,陣列中=必須是所有屬性的型別都相同,而物件中則必須是同一個實體,而且物件只要是同一個實體,使用===就不會在乎它屬性值的不同了,
測驗代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E7%9A%84%E5%AF%B9%E8%B1%A1%E6%AF%94%E8%BE%83.php
參考檔案:
https://www.php.net/manual/zh/language.oop5.object-comparison.php
===============
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265276.html
標籤:PHP
下一篇:ThinkPHP5權限管理
