3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Proxy\Conceptual; /** * Интерфейс Субъекта объявляет общие операции как для Реального Субъекта, так и * для Заместителя. Пока клиент работает с Реальным Субъектом, используя этот * интерфейс, вы сможете передать ему заместителя вместо реального субъекта. */ interface Subject { public function request(): void; } /** * Реальный Субъект содержит некоторую базовую бизнес-логику. Как правило, * Реальные Субъекты способны выполнять некоторую полезную работу, которая к * тому же может быть очень медленной или точной – например, коррекция входных * данных. Заместитель может решить эти задачи без каких-либо изменений в коде * Реального Субъекта. */ class RealSubject implements Subject { public function request(): void { echo "RealSubject: Handling request.\n"; } } /** * Интерфейс Заместителя идентичен интерфейсу Реального Субъекта. */ class Proxy implements Subject { /** * @var RealSubject */ private $realSubject; /** * Заместитель хранит ссылку на объект класса РеальныйСубъект. Клиент может * либо лениво загрузить его, либо передать Заместителю. */ public function __construct(RealSubject $realSubject) { $this->realSubject = $realSubject; } /** * Наиболее распространёнными областями применения паттерна Заместитель * являются ленивая загрузка, кэширование, контроль доступа, ведение журнала * и т.д. Заместитель может выполнить одну из этих задач, а затем, в * зависимости от результата, передать выполнение одноимённому методу в * связанном объекте класса Реального Субъект. */ public function request(): void { if ($this->checkAccess()) { $this->realSubject->request(); $this->logAccess(); } } private function checkAccess(): bool { // Некоторые реальные проверки должны проходить здесь. echo "Proxy: Checking access prior to firing a real request.\n"; return true; } private function logAccess(): void { echo "Proxy: Logging the time of request.\n"; } } /** * Клиентский код должен работать со всеми объектами (как с реальными, так и * заместителями) через интерфейс Субъекта, чтобы поддерживать как реальные * субъекты, так и заместителей. В реальной жизни, однако, клиенты в основном * работают с реальными субъектами напрямую. В этом случае, для более простой * реализации паттерна, можно расширить заместителя из класса реального * субъекта. */ function clientCode(Subject $subject) { // ... $subject->request(); // ... } echo "Client: Executing the client code with a real subject:\n"; $realSubject = new RealSubject(); clientCode($realSubject); echo "\n"; echo "Client: Executing the same client code with a proxy:\n"; $proxy = new Proxy($realSubject); clientCode($proxy);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  (null)
number of ops:  19
compiled vars:  !0 = $realSubject, !1 = $proxy
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   22     0  E >   DECLARE_CLASS                                            'refactoringguru%5Cproxy%5Cconceptual%5Crealsubject'
   33     1        DECLARE_CLASS                                            'refactoringguru%5Cproxy%5Cconceptual%5Cproxy'
   95     2        ECHO                                                     'Client%3A+Executing+the+client+code+with+a+real+subject%3A%0A'
   96     3        NEW                                              $2      'RefactoringGuru%5CProxy%5CConceptual%5CRealSubject'
          4        DO_FCALL                                      0          
          5        ASSIGN                                                   !0, $2
   97     6        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CProxy%5CConceptual%5CclientCode'
          7        SEND_VAR_EX                                              !0
          8        DO_FCALL                                      0          
   99     9        ECHO                                                     '%0A'
  101    10        ECHO                                                     'Client%3A+Executing+the+same+client+code+with+a+proxy%3A%0A'
  102    11        NEW                                              $6      'RefactoringGuru%5CProxy%5CConceptual%5CProxy'
         12        SEND_VAR_EX                                              !0
         13        DO_FCALL                                      0          
         14        ASSIGN                                                   !1, $6
  103    15        INIT_NS_FCALL_BY_NAME                                    'RefactoringGuru%5CProxy%5CConceptual%5CclientCode'
         16        SEND_VAR_EX                                              !1
         17        DO_FCALL                                      0          
         18      > RETURN                                                   1

Function refactoringguru%5Cproxy%5Cconceptual%5Cclientcode:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  RefactoringGuru\Proxy\Conceptual\clientCode
number of ops:  4
compiled vars:  !0 = $subject
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   86     0  E >   RECV                                             !0      
   90     1        INIT_METHOD_CALL                                         !0, 'request'
          2        DO_FCALL                                      0          
   93     3      > RETURN                                                   null

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

Class RefactoringGuru\Proxy\Conceptual\Subject:
Function request:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  request
number of ops:  1
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   12     0  E > > RETURN                                                   null

End of function request

End of class RefactoringGuru\Proxy\Conceptual\Subject.

Class RefactoringGuru\Proxy\Conceptual\RealSubject:
Function request:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  request
number of ops:  2
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   26     0  E >   ECHO                                                     'RealSubject%3A+Handling+request.%0A'
   27     1      > RETURN                                                   null

End of function request

End of class RefactoringGuru\Proxy\Conceptual\RealSubject.

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

End of function __construct

Function request:
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
filename:       /in/HKgWe
function name:  request
number of ops:  9
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   58     0  E >   INIT_METHOD_CALL                                         'checkAccess'
          1        DO_FCALL                                      0  $0      
          2      > JMPZ                                                     $0, ->8
   59     3    >   FETCH_OBJ_R                                      ~1      'realSubject'
          4        INIT_METHOD_CALL                                         ~1, 'request'
          5        DO_FCALL                                      0          
   60     6        INIT_METHOD_CALL                                         'logAccess'
          7        DO_FCALL                                      0          
   62     8    > > RETURN                                                   null

End of function request

Function checkaccess:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  checkAccess
number of ops:  4
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   67     0  E >   ECHO                                                     'Proxy%3A+Checking+access+prior+to+firing+a+real+request.%0A'
   69     1      > RETURN                                                   <true>
   70     2*       VERIFY_RETURN_TYPE                                       
          3*     > RETURN                                                   null

End of function checkaccess

Function logaccess:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/HKgWe
function name:  logAccess
number of ops:  2
compiled vars:  none
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   74     0  E >   ECHO                                                     'Proxy%3A+Logging+the+time+of+request.%0A'
   75     1      > RETURN                                                   null

End of function logaccess

End of class RefactoringGuru\Proxy\Conceptual\Proxy.

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
161.55 ms | 1403 KiB | 15 Q