经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP中的对象比较
来源:cnblogs  作者:硬核项目经理  时间:2021/3/8 12:03:08  对本文有异议

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

首先,我们先根据PHP文档来定义对象比较的方式:

  • 同一个类的实例,比较属性大小,根据顺序,遇到不同的属性值后比较返回,后续的不会再比较
  • 不同类的实例,比较属性值
  • ===,必须是同一个实例

我们通过一个例子来看下:

  1. function bool2str($bool)
  2. {
  3. if ($bool === false) {
  4. return 'FALSE';
  5. } else {
  6. return 'TRUE';
  7. }
  8. }
  9. function compareObjects(&$o1, &$o2)
  10. {
  11. echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n";
  12. echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n";
  13. }
  14. class A {
  15. private $t = true;
  16. public function setT($t){
  17. $this->t = $t;
  18. }
  19. }
  20. class B {
  21. protected $t = true;
  22. public function setT1($t){
  23. $this->t = $t;
  24. }
  25. }
  26. class C {
  27. private $t = true;
  28. public function setT($t){
  29. $this->t = $t;
  30. }
  31. }
  32. $a1 = new A();
  33. $a2 = new A();
  34. compareObjects($a1, $a2); // 相同的类
  35. // o1 == o2 : TRUE
  36. // o1 === o2 : FALSE
  37. $a11 = $a1;
  38. compareObjects($a1, $a11); // 相同的实例
  39. // o1 == o2 : TRUE
  40. // o1 === o2 : TRUE
  41. $a11->setT(false);
  42. compareObjects($a1, $a11); // 相同实例属性值不同
  43. // o1 == o2 : TRUE
  44. // o1 === o2 : TRUE
  45. $b = new B();
  46. compareObjects($a1, $b); // 不同的类
  47. // o1 == o2 : FALSE
  48. // o1 === o2 : FALSE
  49. $c = new C();
  50. compareObjects($a1, $b); // 相同属性不同的类
  51. // o1 == o2 : FALSE
  52. // o1 === o2 : FALSE

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

  1. $c = new stdClass();
  2. $d = new stdClass();
  3. $c->t1 = 'c';
  4. $c->t2 = 10;
  5. $c->t3 = 50;
  6. $d->t1 = 'c';
  7. $d->t2 = 11;
  8. $d->t3 = 40;
  9. echo 'c > d:', $c > $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  10. echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  11. $d->t2 = 10; // $t2属性改成相等的
  12. echo 'c > d:', $c > $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  13. echo 'c < d:', $c < $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  14. $d->t3 = 50; // $c、$d属性都相等了
  15. echo 'c >= d:', $c >= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  16. echo 'c <= d:', $c <= $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  17. echo 'c == d:', $c == $d ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  18. echo 'c === d:', $c === $d ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  19. $c1 = clone $c; // 复制同一个对象
  20. echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  21. echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  22. $c1->t4 = 'f'; // 增加了一个属性
  23. echo 'c > c1:', $c > $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // TRUE
  24. echo 'c < c1:', $c < $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  25. echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  26. echo 'c === c1:', $c === $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  27. unset($c1->t4);
  28. $c1->t1 = 'd'; // 修改了一个值
  29. echo 'c == c1:', $c == $c1 ? 'TRUE' : 'FALSE', PHP_EOL; // FALSE
  30. echo '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

===============

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14467280.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号