3v4l.org

run code in 500+ 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
   96    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
   54     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
   66     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
   78     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.5.0


preferences:
174.11 ms | 2111 KiB | 15 Q