3v4l.org

run code in 500+ PHP versions simultaneously
<?php namespace RefactoringGuru\Prototype\Conceptual; /** * Пример класса, имеющего возможность клонирования. Мы посмотрим как происходит * клонирование значений полей разных типов. */ class Prototype { public $primitive; public $component; public $circularReference; /** * PHP имеет встроенную поддержку клонирования. Вы можете «клонировать» * объект без определения каких-либо специальных методов, при условии, что * его поля имеют примитивные типы. Поля, содержащие объекты, сохраняют свои * ссылки в клонированном объекте. Поэтому в некоторых случаях вам может * понадобиться клонировать также и вложенные объекты. Это можно сделать * специальным методом clone. */ public function __clone() { $this->component = clone $this->component; // Клонирование объекта, который имеет вложенный объект с обратной // ссылкой, требует специального подхода. После завершения клонирования // вложенный объект должен указывать на клонированный объект, а не на // исходный объект. $this->circularReference = clone $this->circularReference; $this->circularReference->prototype = $this; } } class ComponentWithBackReference { public $prototype; /** * Обратите внимание, что конструктор не будет выполнен во время * клонирования. Если у вас сложная логика внутри конструктора, вам может * потребоваться выполнить ее также и в методе clone. */ public function __construct(Prototype $prototype) { $this->prototype = $prototype; } } /** * Клиентский код. */ function clientCode() { $p1 = new Prototype(); $p1->primitive = 245; $p1->component = new \DateTime(); $p1->circularReference = new ComponentWithBackReference($p1); $p2 = clone $p1; if ($p1->primitive === $p2->primitive) { echo "Primitive field values have been carried over to a clone. Yay!\n"; } else { echo "Primitive field values have not been copied. Booo!\n"; } if ($p1->component === $p2->component) { echo "Simple component has not been cloned. Booo!\n"; } else { echo "Simple component has been cloned. Yay!\n"; } if ($p1->circularReference === $p2->circularReference) { echo "Component with back reference has not been cloned. Booo!\n"; } else { echo "Component with back reference has been cloned. Yay!\n"; } if ($p1->circularReference->prototype === $p2->circularReference->prototype) { echo "Component with back reference is linked to original object. Booo!\n"; } else { echo "Component with back reference is linked to the clone. Yay!\n"; } } clientCode();
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/YW00P
function name:  (null)
number of ops:  3
compiled vars:  none
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   86     0  E >   INIT_NS_FCALL_BY_NAME                                        'RefactoringGuru%5CPrototype%5CConceptual%5CclientCode'
          1        DO_FCALL                                          0          
          2      > RETURN                                                       1

Function refactoringguru%5Cprototype%5Cconceptual%5Cclientcode:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 20, Position 2 = 22
Branch analysis from position: 20
1 jumps found. (Code = 42) Position 1 = 23
Branch analysis from position: 23
2 jumps found. (Code = 43) Position 1 = 27, Position 2 = 29
Branch analysis from position: 27
1 jumps found. (Code = 42) Position 1 = 30
Branch analysis from position: 30
2 jumps found. (Code = 43) Position 1 = 34, Position 2 = 36
Branch analysis from position: 34
1 jumps found. (Code = 42) Position 1 = 37
Branch analysis from position: 37
2 jumps found. (Code = 43) Position 1 = 43, Position 2 = 45
Branch analysis from position: 43
1 jumps found. (Code = 42) Position 1 = 46
Branch analysis from position: 46
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 45
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 36
2 jumps found. (Code = 43) Position 1 = 43, Position 2 = 45
Branch analysis from position: 43
Branch analysis from position: 45
Branch analysis from position: 29
2 jumps found. (Code = 43) Position 1 = 34, Position 2 = 36
Branch analysis from position: 34
Branch analysis from position: 36
Branch analysis from position: 22
2 jumps found. (Code = 43) Position 1 = 27, Position 2 = 29
Branch analysis from position: 27
Branch analysis from position: 29
filename:       /in/YW00P
function name:  RefactoringGuru\Prototype\Conceptual\clientCode
number of ops:  47
compiled vars:  !0 = $p1, !1 = $p2
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   56     0  E >   NEW                                                  $2      'RefactoringGuru%5CPrototype%5CConceptual%5CPrototype'
          1        DO_FCALL                                          0          
          2        ASSIGN                                                       !0, $2
   57     3        ASSIGN_OBJ                                                   !0, 'primitive'
          4        OP_DATA                                                      245
   58     5        NEW                                                  $7      'DateTime'
          6        DO_FCALL                                          0          
          7        ASSIGN_OBJ                                                   !0, 'component'
          8        OP_DATA                                                      $7
   59     9        NEW                                                  $10     'RefactoringGuru%5CPrototype%5CConceptual%5CComponentWithBackReference'
         10        SEND_VAR_EX                                                  !0
         11        DO_FCALL                                          0          
         12        ASSIGN_OBJ                                                   !0, 'circularReference'
         13        OP_DATA                                                      $10
   61    14        CLONE                                                ~12     !0
         15        ASSIGN                                                       !1, ~12
   62    16        FETCH_OBJ_R                                          ~14     !0, 'primitive'
         17        FETCH_OBJ_R                                          ~15     !1, 'primitive'
         18        IS_IDENTICAL                                                 ~14, ~15
         19      > JMPZ                                                         ~16, ->22
   63    20    >   ECHO                                                         'Primitive+field+values+have+been+carried+over+to+a+clone.+Yay%21%0A'
   62    21      > JMP                                                          ->23
   65    22    >   ECHO                                                         'Primitive+field+values+have+not+been+copied.+Booo%21%0A'
   67    23    >   FETCH_OBJ_R                                          ~17     !0, 'component'
         24        FETCH_OBJ_R                                          ~18     !1, 'component'
         25        IS_IDENTICAL                                                 ~17, ~18
         26      > JMPZ                                                         ~19, ->29
   68    27    >   ECHO                                                         'Simple+component+has+not+been+cloned.+Booo%21%0A'
   67    28      > JMP                                                          ->30
   70    29    >   ECHO                                                         'Simple+component+has+been+cloned.+Yay%21%0A'
   73    30    >   FETCH_OBJ_R                                          ~20     !0, 'circularReference'
         31        FETCH_OBJ_R                                          ~21     !1, 'circularReference'
         32        IS_IDENTICAL                                                 ~20, ~21
         33      > JMPZ                                                         ~22, ->36
   74    34    >   ECHO                                                         'Component+with+back+reference+has+not+been+cloned.+Booo%21%0A'
   73    35      > JMP                                                          ->37
   76    36    >   ECHO                                                         'Component+with+back+reference+has+been+cloned.+Yay%21%0A'
   79    37    >   FETCH_OBJ_R                                          ~23     !0, 'circularReference'
         38        FETCH_OBJ_R                                          ~24     ~23, 'prototype'
         39        FETCH_OBJ_R                                          ~25     !1, 'circularReference'
         40        FETCH_OBJ_R                                          ~26     ~25, 'prototype'
         41        IS_IDENTICAL                                                 ~24, ~26
         42      > JMPZ                                                         ~27, ->45
   80    43    >   ECHO                                                         'Component+with+back+reference+is+linked+to+original+object.+Booo%21%0A'
   79    44      > JMP                                                          ->46
   82    45    >   ECHO                                                         'Component+with+back+reference+is+linked+to+the+clone.+Yay%21%0A'
   84    46    > > RETURN                                                       null

End of function refactoringguru%5Cprototype%5Cconceptual%5Cclientcode

Class RefactoringGuru\Prototype\Conceptual\Prototype:
Function __clone:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/YW00P
function name:  __clone
number of ops:  13
compiled vars:  none
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   25     0  E >   FETCH_OBJ_R                                          ~1      'component'
          1        CLONE                                                ~2      ~1
          2        ASSIGN_OBJ                                                   'component'
          3        OP_DATA                                                      ~2
   31     4        FETCH_OBJ_R                                          ~4      'circularReference'
          5        CLONE                                                ~5      ~4
          6        ASSIGN_OBJ                                                   'circularReference'
          7        OP_DATA                                                      ~5
   32     8        FETCH_THIS                                           ~8      
          9        FETCH_OBJ_W                                          $6      'circularReference'
         10        ASSIGN_OBJ                                                   $6, 'prototype'
         11        OP_DATA                                                      ~8
   33    12      > RETURN                                                       null

End of function __clone

End of class RefactoringGuru\Prototype\Conceptual\Prototype.

Class RefactoringGuru\Prototype\Conceptual\ComponentWithBackReference:
Function __construct:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/YW00P
function name:  __construct
number of ops:  4
compiled vars:  !0 = $prototype
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   45     0  E >   RECV                                                 !0      
   47     1        ASSIGN_OBJ                                                   'prototype'
          2        OP_DATA                                                      !0
   48     3      > RETURN                                                       null

End of function __construct

End of class RefactoringGuru\Prototype\Conceptual\ComponentWithBackReference.

Generated using Vulcan Logic Dumper, using php 8.5.0


preferences:
159.09 ms | 2040 KiB | 14 Q