php对象比较大小,PHP中的对象比较

在之前的文章中,我们讲过[PHP中比较数组的时候发生了什么?]。这次,我们来讲讲在对象比较的时候PHP是怎样进行比较的。

首先,我们先根据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";

}

class A {

private $t = true;

public function setT($t){

$this->t = $t;

}

}

class B {

protected $t = true;

public function setT1($t){

$this->t = $t;

}

}

class C {

private $t = true;

public function setT($t){

$this->t = $t;

}

}

$a1 = new A();

$a2 = new A();

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 = new B();

compareObjects($a1, $b); // 不同的类

// o1 == o2 : FALSE

// o1 === o2 : FALSE

$c = new C();

compareObjects($a1, $b); // 相同属性不同的类

// o1 == o2 : FALSE

// o1 === o2 : FALSE

从例子中,我们可以看出基本都是符合上述三个条件的,不过需要注意的是,在===的情况下,如果是同一个实例对象,属性值不同也会返回TRUE。我们再通过一个更复杂的例子来观察:

$c = new stdClass();

$d = new stdClass();

$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; // FALSE

echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

$d->t2 = 10; // $t2属性改成相等的

echo 'c > d:', $c > $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

$d->t3 = 50; // $c、$d属性都相等了

echo 'c >= d:', $c >= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c <= d:', $c <= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c == d:', $c == $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c === d:', $c === $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

$c1 = clone $c; // 复制同一个对象

echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

$c1->t4 = 'f'; // 增加了一个属性

echo 'c > c1:', $c > $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE

echo 'c < c1:', $c < $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

unset($c1->t4);

$c1->t1 = 'd'; // 修改了一个值

echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE

这个例子中,我们进行了的对比,在这种对比中,都是根据属性值来进行比对的,而对比的顺序也是属性值的英文排序。当KaTeX parse error: Expected 'EOF', got '有' at position 3: t2有̲了不相等的比较结果时,t3就不会再进行比对了。此外,clone之后的对象并不是原来的实例对象了,所以clone后的对象和原对象是无法用===来获得相等的结果的。当一个对象的属性比另一个对象多时,这个对象也会比属性少的对象大。

对象的比较其实和数组是有些类似的,但它们又有着些许的不同。一个重要的方面就是把握住它们都会进行属性比较,另外还有就是=的差别,数组中=必须是所有属性的类型都相同,而对象中则必须是同一个实例,而且对象只要是同一个实例,使用===就不会在乎它属性值的不同了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值