文字

对象的比较

在 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 );
?>

以上例程会输出:


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 对象的一个相关数组。

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
上一篇: 下一篇: