26:PHP对象复制和对象比较

对象复制

在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

 

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

$copy_of_object = clone $object;

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

void __clone ( void )

当复制完成时,如果定义了 __clone()方法,则新创建的对象(复制生成的对象)中的 __clone()方法会被调用,可用于修改属性的值(如果有必要的话)。

  1. <?php
  2.  class  SubObject
  3.  {
  4.     static  $instances  =  0 ;
  5.     public  $instance ;
  6.     public function  __construct () {
  7.          $this -> instance  = ++ self :: $instances ;
  8.     }
  9.     public function  __clone () {
  10.          $this -> instance  = ++ self :: $instances ;
  11.     }
  12. }
  13. class  MyCloneable
  14.  {
  15.     public  $object1 ;
  16.     public  $object2 ;
  17.     function  __clone ()
  18.     {
  19.          // 强制复制一份this->object, 否则仍然指向同一个对象
  20.          $this -> object1  = clone  $this -> object1 ;
  21.     }
  22. }
  23. $obj  = new  MyCloneable ();
  24. $obj -> object1  = new  SubObject ();
  25.  $obj -> object2  = new  SubObject ();
  26. $obj2  = clone  $obj ;
  27. print( "Original Object:\n" );
  28.  print_r ( $obj );
  29. print( "Cloned Object:\n" );
  30.  print_r ( $obj2 );
  31. /**
  32. 以上例程会输出:
  33. Original Object:
  34. MyCloneable Object
  35. (
  36.     [object1] => SubObject Object
  37.         (
  38.             [instance] => 1
  39.         )    [object2] => SubObject Object
  40.         (
  41.             [instance] => 2
  42.         ))
  43. Cloned Object:
  44. MyCloneable Object
  45. (
  46.     [object1] => SubObject Object
  47.         (
  48.             [instance] => 3
  49.         )    [object2] => SubObject Object
  50.         (
  51.             [instance] => 2
  52.         ))
  53. **/

PHP对象复制和对象比较

对象比较

PHP 5 中的对象比较要比 PHP 4 中复杂,所期望的结果更符合一个面向对象语言。

当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。

而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。

  1. <?php
  2.  function  bool2str ( $bool )
  3. {
  4.     if ( $bool  ===  false ) {
  5.         return  'FALSE' ;
  6.     } else {
  7.         return  'TRUE' ;
  8.     }
  9. }
  10. function  compareObjects (& $o1 , & $o2 )
  11. {
  12.     echo  'o1 == o2 : '  .  bool2str ( $o1  ==  $o2 ) .  "\n" ;
  13.     echo  'o1 != o2 : '  .  bool2str ( $o1  !=  $o2 ) .  "\n" ;
  14.     echo  'o1 === o2 : '  .  bool2str ( $o1  ===  $o2 ) .  "\n" ;
  15.     echo  'o1 !== o2 : '  .  bool2str ( $o1  !==  $o2 ) .  "\n" ;
  16. }
  17. class  Flag
  18.  {
  19.     public  $flag ;
  20.     function  Flag ( $flag  =  true ) {
  21.          $this -> flag  =  $flag ;
  22.     }
  23. }
  24. class  OtherFlag
  25.  {
  26.     public  $flag ;
  27.     function  OtherFlag ( $flag  =  true ) {
  28.          $this -> flag  =  $flag ;
  29.     }
  30. }
  31. $o  = new  Flag ();
  32.  $p  = new  Flag ();
  33.  $q  =  $o ;
  34.  $r  = new  OtherFlag ();
  35. echo  "Two instances of the same class\n" ;
  36.  compareObjects ( $o ,  $p );
  37. echo  "\nTwo references to the same instance\n" ;
  38.  compareObjects ( $o ,  $q );
  39. echo  "\nInstances of two different classes\n" ;
  40.  compareObjects ( $o ,  $r );
  41.  /**以上例程会输出:
  42. Two instances of the same class
  43. o1 == o2 : TRUE
  44. o1 != o2 : FALSE
  45. o1 === o2 : FALSE
  46. o1 !== o2 : TRUETwo references to the same instance
  47. o1 == o2 : TRUE
  48. o1 != o2 : FALSE
  49. o1 === o2 : TRUE
  50. o1 !== o2 : FALSEInstances of two different classes
  51. o1 == o2 : FALSE
  52. o1 != o2 : TRUE
  53. o1 === o2 : FALSE
  54. o1 !== o2 : TRUE
  55. **/
    A+
发布日期:2017年01月04日 20:53:00  所属分类:PHP教程
最后更新时间:2017-01-04 20:53:00
付杰
  • ¥ 98.0元
  • 市场价:198.0元
  • ¥ 999元
  • 市场价:4999元
  • ¥ 79.0元
  • 市场价:99.0元
  • ¥ 298.0元
  • 市场价:398.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: