3v4l.org

run code in 300+ PHP versions simultaneously
<?php class A { public B|C $x; public function __construct(B|C $x) { $this->x = $x; } public function __sleep() { return ['x']; } } class B { public A $a; public function __serialize() { return ['a' => new A($this)]; } } class C { public A $a; private self $instance; public function __serialize() { return ['a' => new A($this)]; } public function __clone() { $this->instance = $this; } } // instantiate $b = new B(); $c = new C(); // clone and assign $ib = clone $b; $ic = clone $c; // serialize $sb = serialize($b); $scb = serialize(clone $b); $sib = serialize($ib); $sc = serialize($c); $scc = serialize(clone $c); $sic = serialize($ic); // unserialize $ub = unserialize($sb); $ucb = unserialize($scb); $uib = unserialize($sib); $uc = unserialize($sc); $ucc = unserialize($scc); $uic = unserialize($sic); // expected behavior is b == b->a->x printf("original ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($ub), spl_object_id($ub->a), spl_object_id($ub->a->x)); printf("cloned ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($ucb), spl_object_id($ucb->a), spl_object_id($ucb->a->x)); printf("cloned & assigned ids: b:%s, b->a:%s, b->a->x:%s \n", spl_object_id($uib), spl_object_id($uib->a), spl_object_id($uib->a->x)); printf(PHP_EOL); // expected behavior is c == c->a->x printf("original ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($uc), spl_object_id($uc->a), spl_object_id($uc->a->x)); printf("cloned ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($ucc), spl_object_id($ucc->a), spl_object_id($ucc->a->x)); printf("cloned & assigned ids: c:%s, c->a:%s, c->a->x:%s \n", spl_object_id($uic), spl_object_id($uic->a), spl_object_id($uic->a->x)); printf(PHP_EOL); printf("serialized original: %s\n", $sb); printf("serialized clone : %s\n", $scb);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  (null)
number of ops:  183
compiled vars:  !0 = $b, !1 = $c, !2 = $ib, !3 = $ic, !4 = $sb, !5 = $scb, !6 = $sib, !7 = $sc, !8 = $scc, !9 = $sic, !10 = $ub, !11 = $ucb, !12 = $uib, !13 = $uc, !14 = $ucc, !15 = $uic
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   40     0  E >   NEW                                              $16     'B'
          1        DO_FCALL                                      0          
          2        ASSIGN                                                   !0, $16
   41     3        NEW                                              $19     'C'
          4        DO_FCALL                                      0          
          5        ASSIGN                                                   !1, $19
   44     6        CLONE                                            ~22     !0
          7        ASSIGN                                                   !2, ~22
   45     8        CLONE                                            ~24     !1
          9        ASSIGN                                                   !3, ~24
   48    10        INIT_FCALL                                               'serialize'
         11        SEND_VAR                                                 !0
         12        DO_ICALL                                         $26     
         13        ASSIGN                                                   !4, $26
   49    14        INIT_FCALL                                               'serialize'
         15        CLONE                                            ~28     !0
         16        SEND_VAL                                                 ~28
         17        DO_ICALL                                         $29     
         18        ASSIGN                                                   !5, $29
   50    19        INIT_FCALL                                               'serialize'
         20        SEND_VAR                                                 !2
         21        DO_ICALL                                         $31     
         22        ASSIGN                                                   !6, $31
   52    23        INIT_FCALL                                               'serialize'
         24        SEND_VAR                                                 !1
         25        DO_ICALL                                         $33     
         26        ASSIGN                                                   !7, $33
   53    27        INIT_FCALL                                               'serialize'
         28        CLONE                                            ~35     !1
         29        SEND_VAL                                                 ~35
         30        DO_ICALL                                         $36     
         31        ASSIGN                                                   !8, $36
   54    32        INIT_FCALL                                               'serialize'
         33        SEND_VAR                                                 !3
         34        DO_ICALL                                         $38     
         35        ASSIGN                                                   !9, $38
   57    36        INIT_FCALL                                               'unserialize'
         37        SEND_VAR                                                 !4
         38        DO_ICALL                                         $40     
         39        ASSIGN                                                   !10, $40
   58    40        INIT_FCALL                                               'unserialize'
         41        SEND_VAR                                                 !5
         42        DO_ICALL                                         $42     
         43        ASSIGN                                                   !11, $42
   59    44        INIT_FCALL                                               'unserialize'
         45        SEND_VAR                                                 !6
         46        DO_ICALL                                         $44     
         47        ASSIGN                                                   !12, $44
   61    48        INIT_FCALL                                               'unserialize'
         49        SEND_VAR                                                 !7
         50        DO_ICALL                                         $46     
         51        ASSIGN                                                   !13, $46
   62    52        INIT_FCALL                                               'unserialize'
         53        SEND_VAR                                                 !8
         54        DO_ICALL                                         $48     
         55        ASSIGN                                                   !14, $48
   63    56        INIT_FCALL                                               'unserialize'
         57        SEND_VAR                                                 !9
         58        DO_ICALL                                         $50     
         59        ASSIGN                                                   !15, $50
   67    60        INIT_FCALL                                               'printf'
         61        SEND_VAL                                                 'original+ids%3A++++++++++b%3A%25s%2C+b-%3Ea%3A%25s%2C+b-%3Ea-%3Ex%3A%25s+%0A'
         62        INIT_FCALL                                               'spl_object_id'
         63        SEND_VAR                                                 !10
         64        DO_ICALL                                         $52     
         65        SEND_VAR                                                 $52
         66        INIT_FCALL                                               'spl_object_id'
         67        FETCH_OBJ_R                                      ~53     !10, 'a'
         68        SEND_VAL                                                 ~53
         69        DO_ICALL                                         $54     
         70        SEND_VAR                                                 $54
         71        INIT_FCALL                                               'spl_object_id'
         72        FETCH_OBJ_R                                      ~55     !10, 'a'
         73        FETCH_OBJ_R                                      ~56     ~55, 'x'
         74        SEND_VAL                                                 ~56
         75        DO_ICALL                                         $57     
         76        SEND_VAR                                                 $57
         77        DO_ICALL                                                 
   68    78        INIT_FCALL                                               'printf'
         79        SEND_VAL                                                 'cloned+ids%3A++++++++++++b%3A%25s%2C+b-%3Ea%3A%25s%2C+b-%3Ea-%3Ex%3A%25s+%0A'
         80        INIT_FCALL                                               'spl_object_id'
         81        SEND_VAR                                                 !11
         82        DO_ICALL                                         $59     
         83        SEND_VAR                                                 $59
         84        INIT_FCALL                                               'spl_object_id'
         85        FETCH_OBJ_R                                      ~60     !11, 'a'
         86        SEND_VAL                                                 ~60
         87        DO_ICALL                                         $61     
         88        SEND_VAR                                                 $61
         89        INIT_FCALL                                               'spl_object_id'
         90        FETCH_OBJ_R                                      ~62     !11, 'a'
         91        FETCH_OBJ_R                                      ~63     ~62, 'x'
         92        SEND_VAL                                                 ~63
         93        DO_ICALL                                         $64     
         94        SEND_VAR                                                 $64
         95        DO_ICALL                                                 
   69    96        INIT_FCALL                                               'printf'
         97        SEND_VAL                                                 'cloned+%26+assigned+ids%3A+b%3A%25s%2C+b-%3Ea%3A%25s%2C+b-%3Ea-%3Ex%3A%25s+%0A'
         98        INIT_FCALL                                               'spl_object_id'
         99        SEND_VAR                                                 !12
        100        DO_ICALL                                         $66     
        101        SEND_VAR                                                 $66
        102        INIT_FCALL                                               'spl_object_id'
        103        FETCH_OBJ_R                                      ~67     !12, 'a'
        104        SEND_VAL                                                 ~67
        105        DO_ICALL                                         $68     
        106        SEND_VAR                                                 $68
        107        INIT_FCALL                                               'spl_object_id'
        108        FETCH_OBJ_R                                      ~69     !12, 'a'
        109        FETCH_OBJ_R                                      ~70     ~69, 'x'
        110        SEND_VAL                                                 ~70
        111        DO_ICALL                                         $71     
        112        SEND_VAR                                                 $71
        113        DO_ICALL                                                 
   71   114        INIT_FCALL                                               'printf'
        115        SEND_VAL                                                 '%0A'
        116        DO_ICALL                                                 
   75   117        INIT_FCALL                                               'printf'
        118        SEND_VAL                                                 'original+ids%3A++++++++++c%3A%25s%2C+c-%3Ea%3A%25s%2C+c-%3Ea-%3Ex%3A%25s+%0A'
        119        INIT_FCALL                                               'spl_object_id'
        120        SEND_VAR                                                 !13
        121        DO_ICALL                                         $74     
        122        SEND_VAR                                                 $74
        123        INIT_FCALL                                               'spl_object_id'
        124        FETCH_OBJ_R                                      ~75     !13, 'a'
        125        SEND_VAL                                                 ~75
        126        DO_ICALL                                         $76     
        127        SEND_VAR                                                 $76
        128        INIT_FCALL                                               'spl_object_id'
        129        FETCH_OBJ_R                                      ~77     !13, 'a'
        130        FETCH_OBJ_R                                      ~78     ~77, 'x'
        131        SEND_VAL                                                 ~78
        132        DO_ICALL                                         $79     
        133        SEND_VAR                                                 $79
        134        DO_ICALL                                                 
   76   135        INIT_FCALL                                               'printf'
        136        SEND_VAL                                                 'cloned+ids%3A++++++++++++c%3A%25s%2C+c-%3Ea%3A%25s%2C+c-%3Ea-%3Ex%3A%25s+%0A'
        137        INIT_FCALL                                               'spl_object_id'
        138        SEND_VAR                                                 !14
        139        DO_ICALL                                         $81     
        140        SEND_VAR                                                 $81
        141        INIT_FCALL                                               'spl_object_id'
        142        FETCH_OBJ_R                                      ~82     !14, 'a'
        143        SEND_VAL                                                 ~82
        144        DO_ICALL                                         $83     
        145        SEND_VAR                                                 $83
        146        INIT_FCALL                                               'spl_object_id'
        147        FETCH_OBJ_R                                      ~84     !14, 'a'
        148        FETCH_OBJ_R                                      ~85     ~84, 'x'
        149        SEND_VAL                                                 ~85
        150        DO_ICALL                                         $86     
        151        SEND_VAR                                                 $86
        152        DO_ICALL                                                 
   77   153        INIT_FCALL                                               'printf'
        154        SEND_VAL                                                 'cloned+%26+assigned+ids%3A+c%3A%25s%2C+c-%3Ea%3A%25s%2C+c-%3Ea-%3Ex%3A%25s+%0A'
        155        INIT_FCALL                                               'spl_object_id'
        156        SEND_VAR                                                 !15
        157        DO_ICALL                                         $88     
        158        SEND_VAR                                                 $88
        159        INIT_FCALL                                               'spl_object_id'
        160        FETCH_OBJ_R                                      ~89     !15, 'a'
        161        SEND_VAL                                                 ~89
        162        DO_ICALL                                         $90     
        163        SEND_VAR                                                 $90
        164        INIT_FCALL                                               'spl_object_id'
        165        FETCH_OBJ_R                                      ~91     !15, 'a'
        166        FETCH_OBJ_R                                      ~92     ~91, 'x'
        167        SEND_VAL                                                 ~92
        168        DO_ICALL                                         $93     
        169        SEND_VAR                                                 $93
        170        DO_ICALL                                                 
   79   171        INIT_FCALL                                               'printf'
        172        SEND_VAL                                                 '%0A'
        173        DO_ICALL                                                 
   81   174        INIT_FCALL                                               'printf'
        175        SEND_VAL                                                 'serialized+original%3A++++%25s%0A'
        176        SEND_VAR                                                 !4
        177        DO_ICALL                                                 
   82   178        INIT_FCALL                                               'printf'
        179        SEND_VAL                                                 'serialized+clone+++%3A++++%25s%0A'
        180        SEND_VAR                                                 !5
        181        DO_ICALL                                                 
        182      > RETURN                                                   1

Class A:
Function __construct:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  __construct
number of ops:  4
compiled vars:  !0 = $x
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    6     0  E >   RECV                                             !0      
    7     1        ASSIGN_OBJ                                               'x'
          2        OP_DATA                                                  !0
    8     3      > RETURN                                                   null

End of function __construct

Function __sleep:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  __sleep
number of ops:  2
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   12     0  E > > RETURN                                                   <array>
   13     1*     > RETURN                                                   null

End of function __sleep

End of class A.

Class B:
Function __serialize:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  __serialize
number of ops:  7
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   21     0  E >   NEW                                              $0      'A'
          1        FETCH_THIS                                       $1      
          2        SEND_VAR_EX                                              $1
          3        DO_FCALL                                      0          
          4        INIT_ARRAY                                       ~3      $0, 'a'
          5      > RETURN                                                   ~3
   22     6*     > RETURN                                                   null

End of function __serialize

End of class B.

Class C:
Function __serialize:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  __serialize
number of ops:  7
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   31     0  E >   NEW                                              $0      'A'
          1        FETCH_THIS                                       $1      
          2        SEND_VAR_EX                                              $1
          3        DO_FCALL                                      0          
          4        INIT_ARRAY                                       ~3      $0, 'a'
          5      > RETURN                                                   ~3
   32     6*     > RETURN                                                   null

End of function __serialize

Function __clone:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/6FKnp
function name:  __clone
number of ops:  4
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   35     0  E >   FETCH_THIS                                       ~1      
          1        ASSIGN_OBJ                                               'instance'
          2        OP_DATA                                                  ~1
   36     3      > RETURN                                                   null

End of function __clone

End of class C.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
146.99 ms | 1020 KiB | 17 Q