您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP中對(duì)象的區(qū)別”,在日常操作中,相信很多人在PHP中對(duì)象的區(qū)別問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP中對(duì)象的區(qū)別”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
在之前的文章中,我們講過PHP中比較數(shù)組的時(shí)候發(fā)生了什么?。這次,我們來講講在對(duì)象比較的時(shí)候PHP是怎樣進(jìn)行比較的。
首先,我們先根據(jù)PHP文檔來定義對(duì)象比較的方式:
我們通過一個(gè)例子來看下:
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); // 相同的實(shí)例
// o1 == o2 : TRUE
// o1 === o2 : TRUE
$a11->setT(false);
compareObjects($a1, $a11); // 相同實(shí)例屬性值不同
// 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
從例子中,我們可以看出基本都是符合上述三個(gè)條件的,不過需要注意的是,在===的情況下,如果是同一個(gè)實(shí)例對(duì)象,屬性值不同也會(huì)返回TRUE。我們?cè)偻ㄟ^一個(gè)更復(fù)雜的例子來觀察:
$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; // 復(fù)制同一個(gè)對(duì)象
echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
$c1->t4 = 'f'; // 增加了一個(gè)屬性
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'; // 修改了一個(gè)值
echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
這個(gè)例子中,我們進(jìn)行了<、>的對(duì)比,在這種對(duì)比中,都是根據(jù)屬性值來進(jìn)行比對(duì)的,而對(duì)比的順序也是屬性值的英文排序。當(dāng)\$t2有了不相等的比較結(jié)果時(shí),$t3就不會(huì)再進(jìn)行比對(duì)了。此外,clone之后的對(duì)象并不是原來的實(shí)例對(duì)象了,所以clone后的對(duì)象和原對(duì)象是無法用===來獲得相等的結(jié)果的。當(dāng)一個(gè)對(duì)象的屬性比另一個(gè)對(duì)象多時(shí),這個(gè)對(duì)象也會(huì)比屬性少的對(duì)象大。
對(duì)象的比較其實(shí)和數(shù)組是有些類似的,但它們又有著些許的不同。一個(gè)重要的方面就是把握住它們都會(huì)進(jìn)行屬性比較,另外還有就是===的差別,數(shù)組中===必須是所有屬性的類型都相同,而對(duì)象中則必須是同一個(gè)實(shí)例,而且對(duì)象只要是同一個(gè)實(shí)例,使用===就不會(huì)在乎它屬性值的不同了。
到此,關(guān)于“PHP中對(duì)象的區(qū)別”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。