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