| 
<?php
 include_once 'armory.php';
 
 Class Proxy
 {
 use armory;
 
 public function __construct() { $this->name = 'proxy'; }
 public function sayHello()    { echo 'Hello from class ' . __CLASS__ . " named {$this->name} \n"; }
 }
 Class A
 {
 public function __construct() { $this->name = 'A'; }
 public function sayHello()    { return function() { echo 'Hello from class ' . __CLASS__ . " named {$this->name} as ".get_called_class()." \n";}; }
 }
 Class B
 {
 public function __construct() { $this->name = 'B'; }
 public function sayHello()    { return function() { echo 'Hello from class ' . __CLASS__ . " named {$this->name} as ".get_called_class()." \n";}; }
 }
 
 function globalFunction($text) { echo "Hello from global scope $text \n"; }
 
 $p = new Proxy;
 $a = new A;
 $b = new B;
 $text = 'none';
 
 $p->a1 = $a->sayHello();
 $p->b1 = $b->sayHello();
 $p->p1 = [$p, 'sayHello'];
 $p->g1 = 'globalFunction';
 $p->g2 = function() use ($text) { return globalFunction($text); };
 
 print_r($p);
 print_r($a);
 print_r($b);
 
 $p->a1();
 $p->b1();
 $p->p1();
 $p->g1('G1');
 $p->g2('G2');
 
 $a->name = 'AA';
 $b->name = 'BB';
 $p->name = 'same';
 
 $p->a1();
 $p->b1();
 $p->p1();
 
 /* Outputs:
 Proxy Object
 (
 [armory:protected] => Array
 (
 [name] => proxy
 [a1] => Closure Object
 (
 [this] => A Object
 (
 [name] => A
 )
 
 )
 
 [b1] => Closure Object
 (
 [this] => B Object
 (
 [name] => B
 )
 
 )
 
 [p1] => Array
 (
 [0] => Proxy Object
 *RECURSION*
 [1] => sayHello
 )
 
 [g1] => globalFunction
 [g2] => Closure Object
 (
 [static] => Array
 (
 [text] => none
 )
 
 )
 
 )
 
 )
 A Object
 (
 [name] => A
 )
 B Object
 (
 [name] => B
 )
 Hello from class A named A as A
 Hello from class B named B as B
 Hello from class Proxy named proxy
 Hello from global scope G1
 Hello from global scope none
 Hello from class A named AA as A
 Hello from class B named BB as B
 Hello from class Proxy named same
 */
 ?>
 |