PHP 4에서 객체 비교
PHP 4에서 객체는 매우 단순한 방식으로 비교된다. 즉: 두 객체 인스턴스
가 같은 속성과 값을 갖고, 같은 클래스의 인스턴스라면 두 객체는 동일하다.
식별 연산자 (===)를 사용하여 두 객체를 비교할때에도
비슷한 규칙이 적용된다.
아래 예제 코드를 실행해보면:
예 13-1. PHP 4에서 객체 비교를 위한 예제코드
<?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; } }
class SwitchableFlag extends Flag {
function turnOn() { $this->flag = true; }
function turnOff() { $this->flag = false; } }
$o = new Flag(); $p = new Flag(false); $q = new Flag();
$r = new SwitchableFlag();
echo "Compare instances created with the same parameters\n"; compareObjects($o, $q);
echo "\nCompare instances created with different parameters\n"; compareObjects($o, $p);
echo "\nCompare an instance of a parent class with one from a subclass\n"; compareObjects($o, $r); ?>
|
|
결과는 다음과 같다:
Compare instances created with the same parameters
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE
Compare instances created with different parameters
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
Compare an instance of a parent class with one from a subclass
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE |
위 출력중 어떤것은 위에서 설명한 비교 규칙이 적용된다는 것을 알수 있다.
같은 속성에 대해 같은 값을 갖고, 같은 클래스에서 파생된 인스턴스만 동일
하고 동치로 판단한다.
복합 객체를 갖는 경우에도 같은 비교 규칙이 적용된다. 아래 예제 코드에서는
컨테이너 클래스를 만들어서 Flag 객체의 결합 배열을
저장한다.
예 13-2. PHP 4에서 복합 객체 비교
<?php class FlagSet { var $set;
function FlagSet($flagArr = array()) { $this->set = $flagArr; }
function addFlag($name, $flag) { $this->set[$name] = $flag; }
function removeFlag($name) { if (array_key_exists($name, $this->set)) { unset($this->set[$name]); } } }
$u = new FlagSet(); $u->addFlag('flag1', $o); $u->addFlag('flag2', $p); $v = new FlagSet(array('flag1'=>$q, 'flag2'=>$p)); $w = new FlagSet(array('flag1'=>$q));
echo "\nComposite objects u(o,p) and v(q,p)\n"; compareObjects($u, $v);
echo "\nu(o,p) and w(q)\n"; compareObjects($u, $w); ?>
|
|
이 코드의 결과는 다음과 같은 출력이 기대된다:
Composite objects u(o,p) and v(q,p)
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE
u(o,p) and w(q)
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE |