3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Flyweight\Conceptual; /** * Легковес хранит общую часть состояния (также называемую внутренним * состоянием), которая принадлежит нескольким реальным бизнес-объектам. * Легковес принимает оставшуюся часть состояния (внешнее состояние, уникальное * для каждого объекта) через его параметры метода. * @source https://refactoring.guru/ru/design-patterns/flyweight/php/example#example-1 */ class Flyweight { private $sharedState; public function __construct($sharedState) { $this->sharedState = $sharedState; } public function operation($uniqueState): void { $s = json_encode($this->sharedState); $u = json_encode($uniqueState); echo "Flyweight: Displaying shared ($s) and unique ($u) state.\n"; } } /** * Фабрика Легковесов создает объекты-Легковесы и управляет ими. Она * обеспечивает правильное разделение легковесов. Когда клиент запрашивает * легковес, фабрика либо возвращает существующий экземпляр, либо создает новый, * если он ещё не существует. */ class FlyweightFactory { /** * @var Flyweight[] */ private $flyweights = []; public function __construct(array $initialFlyweights) { foreach ($initialFlyweights as $state) { $this->flyweights[$this->getKey($state)] = new Flyweight($state); } } /** * Возвращает хеш строки Легковеса для данного состояния. */ private function getKey(array $state): string { ksort($state); return implode("_", $state); } /** * Возвращает существующий Легковес с заданным состоянием или создает новый. */ public function getFlyweight(array $sharedState): Flyweight { $key = $this->getKey($sharedState); if (!isset($this->flyweights[$key])) { echo "FlyweightFactory: Can't find a flyweight, creating new one.\n"; $this->flyweights[$key] = new Flyweight($sharedState); } else { echo "FlyweightFactory: Reusing existing flyweight.\n"; } return $this->flyweights[$key]; } public function listFlyweights(): void { $count = count($this->flyweights); echo "\nFlyweightFactory: I have $count flyweights:\n"; foreach ($this->flyweights as $key => $flyweight) { echo $key . "\n"; } } } /** * Клиентский код обычно создает кучу предварительно заполненных легковесов на * этапе инициализации приложения. */ $factory = new FlyweightFactory([ ["Chevrolet", "Camaro2018", "pink"], ["Mercedes Benz", "C300", "black"], ["Mercedes Benz", "C500", "red"], ["BMW", "M5", "red"], ["BMW", "X6", "white"], // ... ]); $factory->listFlyweights(); // ... function addCarToPoliceDatabase( FlyweightFactory $ff, $plates, $owner, $brand, $model, $color ) { echo "\nClient: Adding a car to database.\n"; $flyweight = $ff->getFlyweight([$brand, $model, $color]); // Клиентский код либо сохраняет, либо вычисляет внешнее состояние и // передает его методам легковеса. $flyweight->operation([$plates, $owner]); } addCarToPoliceDatabase($factory, "CL234IR", "James Doe", "BMW", "M5", "red", ); addCarToPoliceDatabase($factory, "CL234IR", "James Doe", "BMW", "X1", "red", ); $factory->listFlyweights();
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/pqmcG
function name:  (null)
number of ops:  25
compiled vars:  !0 = $factory
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   90     0  E >   NEW                                              $1      'RefactoringGuru%5CFlyweight%5CConceptual%5CFlyweightFactory'
   91     1        SEND_VAL_EX                                              <array>
          2        DO_FCALL                                      0          
   90     3        ASSIGN                                                   !0, $1
   98     4        INIT_METHOD_CALL                                         !0, 'listFlyweights'
          5        DO_FCALL                                      0          
  115     6        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5CaddCarToPoliceDatabase'
          7        SEND_VAR_EX                                              !0
  116     8        SEND_VAL_EX                                              'CL234IR'
  117     9        SEND_VAL_EX                                              'James+Doe'
  118    10        SEND_VAL_EX                                              'BMW'
  119    11        SEND_VAL_EX                                              'M5'
  120    12        SEND_VAL_EX                                              'red'
         13        DO_FCALL                                      0          
  123    14        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5CaddCarToPoliceDatabase'
         15        SEND_VAR_EX                                              !0
  124    16        SEND_VAL_EX                                              'CL234IR'
  125    17        SEND_VAL_EX                                              'James+Doe'
  126    18        SEND_VAL_EX                                              'BMW'
  127    19        SEND_VAL_EX                                              'X1'
  128    20        SEND_VAL_EX                                              'red'
         21        DO_FCALL                                      0          
  131    22        INIT_METHOD_CALL                                         !0, 'listFlyweights'
         23        DO_FCALL                                      0          
         24      > RETURN                                                   1

Function refactoringguru%5Cflyweight%5Cconceptual%5Caddcartopolicedatabase:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/pqmcG
function name:  RefactoringGuru\Flyweight\Conceptual\addCarToPoliceDatabase
number of ops:  20
compiled vars:  !0 = $ff, !1 = $plates, !2 = $owner, !3 = $brand, !4 = $model, !5 = $color, !6 = $flyweight
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
  102     0  E >   RECV                                             !0      
          1        RECV                                             !1      
          2        RECV                                             !2      
          3        RECV                                             !3      
          4        RECV                                             !4      
          5        RECV                                             !5      
  107     6        ECHO                                                     '%0AClient%3A+Adding+a+car+to+database.%0A'
  108     7        INIT_METHOD_CALL                                         !0, 'getFlyweight'
          8        INIT_ARRAY                                       ~7      !3
          9        ADD_ARRAY_ELEMENT                                ~7      !4
         10        ADD_ARRAY_ELEMENT                                ~7      !5
         11        SEND_VAL_EX                                              ~7
         12        DO_FCALL                                      0  $8      
         13        ASSIGN                                                   !6, $8
  112    14        INIT_METHOD_CALL                                         !6, 'operation'
         15        INIT_ARRAY                                       ~10     !1
         16        ADD_ARRAY_ELEMENT                                ~10     !2
         17        SEND_VAL_EX                                              ~10
         18        DO_FCALL                                      0          
  113    19      > RETURN                                                   null

End of function refactoringguru%5Cflyweight%5Cconceptual%5Caddcartopolicedatabase

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

End of function __construct

Function operation:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/pqmcG
function name:  operation
number of ops:  18
compiled vars:  !0 = $uniqueState, !1 = $s, !2 = $u
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   21     0  E >   RECV                                             !0      
   23     1        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5Cjson_encode'
          2        CHECK_FUNC_ARG                                           
          3        FETCH_OBJ_FUNC_ARG                               $3      'sharedState'
          4        SEND_FUNC_ARG                                            $3
          5        DO_FCALL                                      0  $4      
          6        ASSIGN                                                   !1, $4
   24     7        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5Cjson_encode'
          8        SEND_VAR_EX                                              !0
          9        DO_FCALL                                      0  $6      
         10        ASSIGN                                                   !2, $6
   25    11        ROPE_INIT                                     5  ~9      'Flyweight%3A+Displaying+shared+%28'
         12        ROPE_ADD                                      1  ~9      ~9, !1
         13        ROPE_ADD                                      2  ~9      ~9, '%29+and+unique+%28'
         14        ROPE_ADD                                      3  ~9      ~9, !2
         15        ROPE_END                                      4  ~8      ~9, '%29+state.%0A'
         16        ECHO                                                     ~8
   26    17      > RETURN                                                   null

End of function operation

End of class RefactoringGuru\Flyweight\Conceptual\Flyweight.

Class RefactoringGuru\Flyweight\Conceptual\FlyweightFactory:
Function __construct:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 77) Position 1 = 2, Position 2 = 13
Branch analysis from position: 2
2 jumps found. (Code = 78) Position 1 = 3, Position 2 = 13
Branch analysis from position: 3
1 jumps found. (Code = 42) Position 1 = 2
Branch analysis from position: 2
Branch analysis from position: 13
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 13
filename:       /in/pqmcG
function name:  __construct
number of ops:  15
compiled vars:  !0 = $initialFlyweights, !1 = $state
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   42     0  E >   RECV                                             !0      
   44     1      > FE_RESET_R                                       $2      !0, ->13
          2    > > FE_FETCH_R                                               $2, !1, ->13
   45     3    >   INIT_METHOD_CALL                                         'getKey'
          4        SEND_VAR_EX                                              !1
          5        DO_FCALL                                      0  $4      
          6        NEW                                              $6      'RefactoringGuru%5CFlyweight%5CConceptual%5CFlyweight'
          7        SEND_VAR_EX                                              !1
          8        DO_FCALL                                      0          
          9        FETCH_OBJ_W                                      $3      'flyweights'
         10        ASSIGN_DIM                                               $3, $4
         11        OP_DATA                                                  $6
   44    12      > JMP                                                      ->2
         13    >   FE_FREE                                                  $2
   47    14      > RETURN                                                   null

End of function __construct

Function getkey:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/pqmcG
function name:  getKey
number of ops:  12
compiled vars:  !0 = $state
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   52     0  E >   RECV                                             !0      
   54     1        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5Cksort'
          2        SEND_VAR_EX                                              !0
          3        DO_FCALL                                      0          
   56     4        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5Cimplode'
          5        SEND_VAL_EX                                              '_'
          6        SEND_VAR_EX                                              !0
          7        DO_FCALL                                      0  $2      
          8        VERIFY_RETURN_TYPE                                       $2
          9      > RETURN                                                   $2
   57    10*       VERIFY_RETURN_TYPE                                       
         11*     > RETURN                                                   null

End of function getkey

Function getflyweight:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 9, Position 2 = 17
Branch analysis from position: 9
1 jumps found. (Code = 42) Position 1 = 18
Branch analysis from position: 18
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 17
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/pqmcG
function name:  getFlyweight
number of ops:  24
compiled vars:  !0 = $sharedState, !1 = $key
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   62     0  E >   RECV                                             !0      
   64     1        INIT_METHOD_CALL                                         'getKey'
          2        SEND_VAR                                                 !0
          3        DO_FCALL                                      0  $2      
          4        ASSIGN                                                   !1, $2
   66     5        FETCH_OBJ_IS                                     ~4      'flyweights'
          6        ISSET_ISEMPTY_DIM_OBJ                         0  ~5      ~4, !1
          7        BOOL_NOT                                         ~6      ~5
          8      > JMPZ                                                     ~6, ->17
   67     9    >   ECHO                                                     'FlyweightFactory%3A+Can%27t+find+a+flyweight%2C+creating+new+one.%0A'
   68    10        NEW                                              $9      'RefactoringGuru%5CFlyweight%5CConceptual%5CFlyweight'
         11        SEND_VAR_EX                                              !0
         12        DO_FCALL                                      0          
         13        FETCH_OBJ_W                                      $7      'flyweights'
         14        ASSIGN_DIM                                               $7, !1
         15        OP_DATA                                                  $9
         16      > JMP                                                      ->18
   70    17    >   ECHO                                                     'FlyweightFactory%3A+Reusing+existing+flyweight.%0A'
   73    18    >   FETCH_OBJ_R                                      ~11     'flyweights'
         19        FETCH_DIM_R                                      ~12     ~11, !1
         20        VERIFY_RETURN_TYPE                                       ~12
         21      > RETURN                                                   ~12
   74    22*       VERIFY_RETURN_TYPE                                       
         23*     > RETURN                                                   null

End of function getflyweight

Function listflyweights:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 77) Position 1 = 12, Position 2 = 17
Branch analysis from position: 12
2 jumps found. (Code = 78) Position 1 = 13, Position 2 = 17
Branch analysis from position: 13
1 jumps found. (Code = 42) Position 1 = 12
Branch analysis from position: 12
Branch analysis from position: 17
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 17
filename:       /in/pqmcG
function name:  listFlyweights
number of ops:  19
compiled vars:  !0 = $count, !1 = $flyweight, !2 = $key
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   78     0  E >   INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CFlyweight%5CConceptual%5Ccount'
          1        CHECK_FUNC_ARG                                           
          2        FETCH_OBJ_FUNC_ARG                               $3      'flyweights'
          3        SEND_FUNC_ARG                                            $3
          4        DO_FCALL                                      0  $4      
          5        ASSIGN                                                   !0, $4
   79     6        ROPE_INIT                                     3  ~7      '%0AFlyweightFactory%3A+I+have+'
          7        ROPE_ADD                                      1  ~7      ~7, !0
          8        ROPE_END                                      2  ~6      ~7, '+flyweights%3A%0A'
          9        ECHO                                                     ~6
   80    10        FETCH_OBJ_R                                      ~9      'flyweights'
         11      > FE_RESET_R                                       $10     ~9, ->17
         12    > > FE_FETCH_R                                       ~11     $10, !1, ->17
         13    >   ASSIGN                                                   !2, ~11
   81    14        CONCAT                                           ~13     !2, '%0A'
         15        ECHO                                                     ~13
   80    16      > JMP                                                      ->12
         17    >   FE_FREE                                                  $10
   83    18      > RETURN                                                   null

End of function listflyweights

End of class RefactoringGuru\Flyweight\Conceptual\FlyweightFactory.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
212.62 ms | 1415 KiB | 23 Q