3v4l.org

run code in 500+ 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.5.0


preferences:
160.01 ms | 1879 KiB | 17 Q