首先,我们先根据PHP文档来定义工具比较的办法:
同一个类的实例,比较属性大小,根据顺序,碰着不同的属性值后比较返回,后续的不会再比较不同类的实例,比较属性值===,必须是同一个实例我们通过一个例子来看下:
functionbool2str($bool){if($bool===false){return39;FALSE';}else{return'TRUE';}}functioncompareObjects(&$o1,&$o2){echo'o1==o2:'.bool2str($o1==$o2)."\n";echo'o1===o2:'.bool2str($o1===$o2)."\n";}classA{private$t=true;publicfunctionsetT($t){$this->t=$t;}}classB{protected$t=true;publicfunctionsetT1($t){$this->t=$t;}}classC{private$t=true;publicfunctionsetT($t){$this->t=$t;}}$a1=newA();$a2=newA();compareObjects($a1,$a2);//相同的类//o1==o2:TRUE//o1===o2:FALSE$a11=$a1;compareObjects($a1,$a11);//相同的实例//o1==o2:TRUE//o1===o2:TRUE$a11->setT(false);compareObjects($a1,$a11);//相同实例属性值不同//o1==o2:TRUE//o1===o2:TRUE$b=newB();compareObjects($a1,$b);//不同的类//o1==o2:FALSE//o1===o2:FALSE$c=newC();compareObjects($a1,$b);//相同属性不同的类//o1==o2:FALSE//o1===o2:FALSE
从例子中,我们可以看出基本都是符合上述三个条件的,不过须要把稳的是,在===的情形下,如果是同一个实例工具,属性值不同也会返回TRUE。我们再通过一个更繁芜的例子来不雅观察:
$c=newstdClass();$d=newstdClass();$c->t1='c';$c->t2=10;$c->t3=50;$d->t1='c';$d->t2=11;$d->t3=40;echo'c>d:',$c>$d?'TRUE':'FALSE',PHP_EOL;//FALSEecho'c<d:',$c<$d?'TRUE':'FALSE',PHP_EOL;//TRUE$d->t2=10;//$t2属性改成相等的echo'c>d:',$c>$d?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c<d:',$c<$d?'TRUE':'FALSE',PHP_EOL;//FALSE$d->t3=50;//$c、$d属性都相等了echo'c>=d:',$c>=$d?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c<=d:',$c<=$d?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c==d:',$c==$d?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c===d:',$c===$d?'TRUE':'FALSE',PHP_EOL;//FALSE$c1=clone$c;//复制同一个工具echo'c==c1:',$c==$c1?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c===c1:',$c===$c1?'TRUE':'FALSE',PHP_EOL;//FALSE$c1->t4='f';//增加了一个属性echo'c>c1:',$c>$c1?'TRUE':'FALSE',PHP_EOL;//TRUEecho'c<c1:',$c<$c1?'TRUE':'FALSE',PHP_EOL;//FALSEecho'c==c1:',$c==$c1?'TRUE':'FALSE',PHP_EOL;//FALSEecho'c===c1:',$c===$c1?'TRUE':'FALSE',PHP_EOL;//FALSEunset($c1->t4);$c1->t1='d';//修正了一个值echo'c==c1:',$c==$c1?'TRUE':'FALSE',PHP_EOL;//FALSEecho'c===c1:',$c===$c1?'TRUE':'FALSE',PHP_EOL;//FALSE
这个例子中,我们进行了<、>的比拟,在这种比拟中,都是根据属性值来进行比对的,而比拟的顺序也是属性值的英文排序。当\$t2有了不相等的比较结果时,$t3就不会再进行比对了。此外,clone之后的工具并不是原来的实例工具了,以是clone后的工具和原工具是无法用===来得到相等的结果的。当一个工具的属性比另一个工具多时,这个工具也会比属性少的工具大。
工具的比较实在和数组是有些类似的,但它们又有着些许的不同。一个主要的方面便是把握住它们都会进行属性比较,其余还有便是===的差别,数组中===必须是所有属性的类型都相同,而工具中则必须是同一个实例,而且工具只假如同一个实例,利用===就不会在乎它属性值的不同了。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E7%9A%84%E5%AF%B9%E8%B1%A1%E6%AF%94%E8%BE%83.php
参考文档: https://www.php.net/manual/zh/language.oop5.object-comparison.php