Сравняване на обекти

В PHP 5, сравняването на обекти е по-сложен процес, отколкото в PHP 4 и е в съответствие с това, което може да се очаква от един Обектно-Ориентиран Език (не че PHP 5 е такъв език).

При използването на оператора за сравнение (==), обектите се сравняват по прост начин, а именно: Две инстанции на обект са равни, ако имат едни и същи атрибути и стойности и са инстанции на един и същи клас.

От друга страна, при използването на оператора за идентичност (===), обектите са равни тогава, и само тогава, когато сочат към една и съща инстанция на един и същ клас.

Следващият пример ще изясни тези правила.

Пример 19-31. Пример за сравняване на обекти в PHP 5

<?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 Flag($flag = true) {
        $this->flag = $flag;
    }
}

class OtherFlag
{
    public $flag;

    function OtherFlag($flag = true) {
        $this->flag = $flag;
    }
}

$o = new Flag();
$p = new Flag();
$q = $o;
$r = new OtherFlag();

echo "Две инстанции на един и същи клас\n";
compareObjects($o, $p);

echo "\nДве референции към една и съща инстанция\n";
compareObjects($o, $q);

echo "\nИнстанции на два отделни класа\n";
compareObjects($o, $r);
?>

Примерът по-горе ще изведе:

Две инстанции на един и същ клас
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Две референции към една и съща инстанция
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Инстанции на два отделни класа
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Забележка: Разширенията могат да дефинират свои собствени правила за сравняване на обекти, което извършват.