Forum und email

PHP 5에서 객체 비교

Warning

이 확장 모듈은 실험적입니다. 이 확장 모듈의 작동 -- 함수의 이름과 이 확장 모듈에 대한 모든 문서 자료에 대해서 -- 은 이후의 PHP 릴리즈에서 예고 없이 변경될 수 있습니다. 이 확장 모듈의 사용은 사용자의 책임하에 이루어집니다.

PHP 5에서 객체 비교는 PHP 4보다 좀더 복잡하고 객체 지향 언어 (PHP 5는 그런 언어가 아니다)에서 기대할수 있는 특성에 더 가깝다.

비교 연산자 (==)를 사용할 때에는 객체 변수는 단순 한 방식으로 비교된다. 즉: 두 객체 인스턴스가 같은 속성과 값을 갖고, 같은 클래스에서 파생된 인스턴스이고, 같은 네임스페이스에서 선언되었 다면 동일한 객체라고 본다.

하지만, 식별 연산자 (===)를 사용하면 객체 변수는 오직 같은 클래스(특별한 네임스페이스에서)의 같은 인스턴스로 참조될때만 동일한 객체라고 본다.

다음 예제 코드를 보고 이런 규칙을 음미해보자.

Example#1 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 {
    var 
$flag;

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

namespace Other {

    class 
Flag {
        var 
$flag;

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

}

$o = new Flag();
$p = new Flag();
$q $o;
$r = new Other::Flag();

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 similarly named classes in different namespaces\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 similarly named classes in different namespaces
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE