©
This document uses PHP Chinese website manual Release
在 PHP 4 中,对象比较的规则十分简单:如果两个对象是同一个类的实例,且它们有相同的属性和值,则这两个对象相等。类似的规则还适用与用全等符(===)对两个对象的比较。
如果执行以下范例中的代码:
Example #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 );
?>
以上例程会输出:
即使对于具有对象成分的类,比较的规则也相同。在以下的范例中建立了一个容器类来储存 Flag 对象的一个相关数组。
Example #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 : FALSEu(o,p) and w(q) o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE