3v4l.org

run code in 300+ 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'
         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'
         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'
         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'
         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.0.0


preferences:
169.36 ms | 1407 KiB | 14 Q