3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\ChainOfResponsibility\Conceptual; /** * Интерфейс Обработчика объявляет метод построения цепочки обработчиков. Он * также объявляет метод для выполнения запроса. */ interface Handler { public function setNext(Handler $handler): Handler; public function handle(string $request): ?string; } /** * Поведение цепочки по умолчанию может быть реализовано внутри базового класса * обработчика. */ abstract class AbstractHandler implements Handler { /** * @var Handler */ private $nextHandler; public function setNext(Handler $handler): Handler { $this->nextHandler = $handler; // Возврат обработчика отсюда позволит связать обработчики простым // способом, вот так: // $monkey->setNext($squirrel)->setNext($dog); return $handler; } public function handle(string $request): ?string { if ($this->nextHandler) { return $this->nextHandler->handle($request); } return null; } } /** * Все Конкретные Обработчики либо обрабатывают запрос, либо передают его * следующему обработчику в цепочке. */ class MonkeyHandler extends AbstractHandler { public function handle(string $request): ?string { if ($request === "Banana") { return "Monkey: I'll eat the " . $request . ".\n"; } else { return parent::handle($request); } } } class SquirrelHandler extends AbstractHandler { public function handle(string $request): ?string { if ($request === "Nut") { return "Squirrel: I'll eat the " . $request . ".\n"; } else { return parent::handle($request); } } } class DogHandler extends AbstractHandler { public function handle(string $request): ?string { if ($request === "MeatBall") { return "Dog: I'll eat the " . $request . ".\n"; } else { return parent::handle($request); } } } /** * Обычно клиентский код приспособлен для работы с единственным обработчиком. В * большинстве случаев клиенту даже неизвестно, что этот обработчик является * частью цепочки. */ function clientCode(Handler $handler) { foreach (["Nut", "Banana", "Cup of coffee"] as $food) { echo "Client: Who wants a " . $food . "?\n"; $result = $handler->handle($food); if ($result) { echo " " . $result; } else { echo " " . $food . " was left untouched.\n"; } } } /** * Другая часть клиентского кода создает саму цепочку. */ $monkey = new MonkeyHandler(); $squirrel = new SquirrelHandler(); $dog = new DogHandler(); $monkey->setNext($squirrel)->setNext($dog); /** * Клиент должен иметь возможность отправлять запрос любому обработчику, а не * только первому в цепочке. */ echo "Chain: Monkey > Squirrel > Dog\n\n"; clientCode($monkey); echo "\n"; echo "Subchain: Squirrel > Dog\n\n"; clientCode($squirrel);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  (null)
number of ops:  29
compiled vars:  !0 = $monkey, !1 = $squirrel, !2 = $dog
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   20     0  E >   DECLARE_CLASS                                            'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cabstracthandler'
   50     1        DECLARE_CLASS                                            'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cmonkeyhandler', 'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cabstracthandler'
   62     2        DECLARE_CLASS                                            'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Csquirrelhandler', 'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cabstracthandler'
   74     3        DECLARE_CLASS                                            'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cdoghandler', 'refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cabstracthandler'
  107     4        NEW                                              $3      'RefactoringGuru%5CChainOfResponsibility%5CConceptual%5CMonkeyHandler'
          5        DO_FCALL                                      0          
          6        ASSIGN                                                   !0, $3
  108     7        NEW                                              $6      'RefactoringGuru%5CChainOfResponsibility%5CConceptual%5CSquirrelHandler'
          8        DO_FCALL                                      0          
          9        ASSIGN                                                   !1, $6
  109    10        NEW                                              $9      'RefactoringGuru%5CChainOfResponsibility%5CConceptual%5CDogHandler'
         11        DO_FCALL                                      0          
         12        ASSIGN                                                   !2, $9
  111    13        INIT_METHOD_CALL                                         !0, 'setNext'
         14        SEND_VAR_EX                                              !1
         15        DO_FCALL                                      0  $12     
         16        INIT_METHOD_CALL                                         $12, 'setNext'
         17        SEND_VAR_EX                                              !2
         18        DO_FCALL                                      0          
  117    19        ECHO                                                     'Chain%3A+Monkey+%3E+Squirrel+%3E+Dog%0A%0A'
  118    20        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CChainOfResponsibility%5CConceptual%5CclientCode'
         21        SEND_VAR_EX                                              !0
         22        DO_FCALL                                      0          
  119    23        ECHO                                                     '%0A'
  121    24        ECHO                                                     'Subchain%3A+Squirrel+%3E+Dog%0A%0A'
  122    25        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CChainOfResponsibility%5CConceptual%5CclientCode'
         26        SEND_VAR_EX                                              !1
         27        DO_FCALL                                      0          
         28      > RETURN                                                   1

Function refactoringguru%5Cchainofresponsibility%5Cconceptual%5Cclientcode:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 77) Position 1 = 2, Position 2 = 18
Branch analysis from position: 2
2 jumps found. (Code = 78) Position 1 = 3, Position 2 = 18
Branch analysis from position: 3
2 jumps found. (Code = 43) Position 1 = 11, Position 2 = 14
Branch analysis from position: 11
1 jumps found. (Code = 42) Position 1 = 17
Branch analysis from position: 17
1 jumps found. (Code = 42) Position 1 = 2
Branch analysis from position: 2
Branch analysis from position: 14
1 jumps found. (Code = 42) Position 1 = 2
Branch analysis from position: 2
Branch analysis from position: 18
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 18
filename:       /in/e90m1
function name:  RefactoringGuru\ChainOfResponsibility\Conceptual\clientCode
number of ops:  20
compiled vars:  !0 = $handler, !1 = $food, !2 = $result
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   91     0  E >   RECV                                             !0      
   93     1      > FE_RESET_R                                       $3      <array>, ->18
          2    > > FE_FETCH_R                                               $3, !1, ->18
   94     3    >   CONCAT                                           ~4      'Client%3A+Who+wants+a+', !1
          4        CONCAT                                           ~5      ~4, '%3F%0A'
          5        ECHO                                                     ~5
   95     6        INIT_METHOD_CALL                                         !0, 'handle'
          7        SEND_VAR_EX                                              !1
          8        DO_FCALL                                      0  $6      
          9        ASSIGN                                                   !2, $6
   96    10      > JMPZ                                                     !2, ->14
   97    11    >   CONCAT                                           ~8      '++', !2
         12        ECHO                                                     ~8
         13      > JMP                                                      ->17
   99    14    >   CONCAT                                           ~9      '++', !1
         15        CONCAT                                           ~10     ~9, '+was+left+untouched.%0A'
         16        ECHO                                                     ~10
   93    17    > > JMP                                                      ->2
         18    >   FE_FREE                                                  $3
  102    19      > RETURN                                                   null

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

Class RefactoringGuru\ChainOfResponsibility\Conceptual\Handler:
Function setnext:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  setNext
number of ops:  3
compiled vars:  !0 = $handler
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   11     0  E >   RECV                                             !0      
          1        VERIFY_RETURN_TYPE                                       
          2      > RETURN                                                   null

End of function setnext

Function handle:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  handle
number of ops:  3
compiled vars:  !0 = $request
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   13     0  E >   RECV                                             !0      
          1        VERIFY_RETURN_TYPE                                       
          2      > RETURN                                                   null

End of function handle

End of class RefactoringGuru\ChainOfResponsibility\Conceptual\Handler.

Class RefactoringGuru\ChainOfResponsibility\Conceptual\AbstractHandler:
Function setnext:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  setNext
number of ops:  7
compiled vars:  !0 = $handler
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   27     0  E >   RECV                                             !0      
   29     1        ASSIGN_OBJ                                               'nextHandler'
          2        OP_DATA                                                  !0
   33     3        VERIFY_RETURN_TYPE                                       !0
          4      > RETURN                                                   !0
   34     5*       VERIFY_RETURN_TYPE                                       
          6*     > RETURN                                                   null

End of function setnext

Function handle:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 9
Branch analysis from position: 3
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 9
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  handle
number of ops:  12
compiled vars:  !0 = $request
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   36     0  E >   RECV                                             !0      
   38     1        FETCH_OBJ_R                                      ~1      'nextHandler'
          2      > JMPZ                                                     ~1, ->9
   39     3    >   FETCH_OBJ_R                                      ~2      'nextHandler'
          4        INIT_METHOD_CALL                                         ~2, 'handle'
          5        SEND_VAR_EX                                              !0
          6        DO_FCALL                                      0  $3      
          7        VERIFY_RETURN_TYPE                                       $3
          8      > RETURN                                                   $3
   42     9    > > RETURN                                                   null
   43    10*       VERIFY_RETURN_TYPE                                       
         11*     > RETURN                                                   null

End of function handle

End of class RefactoringGuru\ChainOfResponsibility\Conceptual\AbstractHandler.

Class RefactoringGuru\ChainOfResponsibility\Conceptual\MonkeyHandler:
Function handle:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 8
Branch analysis from position: 3
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 8
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  handle
number of ops:  15
compiled vars:  !0 = $request
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   52     0  E >   RECV                                             !0      
   54     1        IS_IDENTICAL                                             !0, 'Banana'
          2      > JMPZ                                                     ~1, ->8
   55     3    >   CONCAT                                           ~2      'Monkey%3A+I%27ll+eat+the+', !0
          4        CONCAT                                           ~3      ~2, '.%0A'
          5        VERIFY_RETURN_TYPE                                       ~3
          6      > RETURN                                                   ~3
          7*       JMP                                                      ->13
   57     8    >   INIT_STATIC_METHOD_CALL                                  'handle'
          9        SEND_VAR_EX                                              !0
         10        DO_FCALL                                      0  $4      
         11        VERIFY_RETURN_TYPE                                       $4
         12      > RETURN                                                   $4
   59    13*       VERIFY_RETURN_TYPE                                       
         14*     > RETURN                                                   null

End of function handle

End of class RefactoringGuru\ChainOfResponsibility\Conceptual\MonkeyHandler.

Class RefactoringGuru\ChainOfResponsibility\Conceptual\SquirrelHandler:
Function handle:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 8
Branch analysis from position: 3
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 8
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  handle
number of ops:  15
compiled vars:  !0 = $request
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   64     0  E >   RECV                                             !0      
   66     1        IS_IDENTICAL                                             !0, 'Nut'
          2      > JMPZ                                                     ~1, ->8
   67     3    >   CONCAT                                           ~2      'Squirrel%3A+I%27ll+eat+the+', !0
          4        CONCAT                                           ~3      ~2, '.%0A'
          5        VERIFY_RETURN_TYPE                                       ~3
          6      > RETURN                                                   ~3
          7*       JMP                                                      ->13
   69     8    >   INIT_STATIC_METHOD_CALL                                  'handle'
          9        SEND_VAR_EX                                              !0
         10        DO_FCALL                                      0  $4      
         11        VERIFY_RETURN_TYPE                                       $4
         12      > RETURN                                                   $4
   71    13*       VERIFY_RETURN_TYPE                                       
         14*     > RETURN                                                   null

End of function handle

End of class RefactoringGuru\ChainOfResponsibility\Conceptual\SquirrelHandler.

Class RefactoringGuru\ChainOfResponsibility\Conceptual\DogHandler:
Function handle:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 3, Position 2 = 8
Branch analysis from position: 3
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 8
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/e90m1
function name:  handle
number of ops:  15
compiled vars:  !0 = $request
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   76     0  E >   RECV                                             !0      
   78     1        IS_IDENTICAL                                             !0, 'MeatBall'
          2      > JMPZ                                                     ~1, ->8
   79     3    >   CONCAT                                           ~2      'Dog%3A+I%27ll+eat+the+', !0
          4        CONCAT                                           ~3      ~2, '.%0A'
          5        VERIFY_RETURN_TYPE                                       ~3
          6      > RETURN                                                   ~3
          7*       JMP                                                      ->13
   81     8    >   INIT_STATIC_METHOD_CALL                                  'handle'
          9        SEND_VAR_EX                                              !0
         10        DO_FCALL                                      0  $4      
         11        VERIFY_RETURN_TYPE                                       $4
         12      > RETURN                                                   $4
   83    13*       VERIFY_RETURN_TYPE                                       
         14*     > RETURN                                                   null

End of function handle

End of class RefactoringGuru\ChainOfResponsibility\Conceptual\DogHandler.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
174.36 ms | 1415 KiB | 15 Q