| 
<?php
 include_once 'arsenal.php';
 
 Class A
 {
 use arsenal;
 function __construct() { echo 'Creating class A as ' . __CLASS__ . " \n"; }
 function sayHello()    { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 Class B
 {
 use arsenal;
 function __construct() { echo 'Creating class B as ' . __CLASS__ . " \n"; }
 function sayHello()    { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 
 Class A1
 {
 function __construct($obj) { echo 'Creating class A1 from ' . get_class($obj) . " \n"; }
 function sayHello()        { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 Class A2
 {
 function __construct($obj) { echo 'Creating class A2 from ' . get_class($obj) . " \n"; }
 function sayHello()        { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 Class B1
 {
 function __construct($obj) { echo 'Creating class B1 from ' . get_class($obj) . " \n"; }
 function sayHello()        { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 Class B2
 {
 function __construct($obj) { echo 'Creating class B2 from ' . get_class($obj) . " \n"; }
 function sayHello()        { echo 'Hello from class ' . __CLASS__ . " \n"; }
 }
 
 $a = new A;
 $b = new B;
 print_r($a);
 print_r($b);
 
 $a->a1->sayHello();
 $a->a2->sayHello();
 $a->b1->sayHello();
 $a->b2->sayHello();
 $b->b1->sayHello();
 $b->b2->sayHello();
 
 print_r($a);
 print_r($b);
 
 $a->a1->sayHello();
 $a->a2->sayHello();
 $a->b1->sayHello();
 $a->b2->sayHello();
 $b->b1->sayHello();
 $b->b2->sayHello();
 
 $b->a1->sayHello(); // throws error !!
 
 /* Ouputs:
 Creating class A as A
 Creating class B as B
 A Object
 (
 )
 B Object
 (
 )
 Creating class A1 from A
 Hello from class A1
 Creating class A2 from A
 Hello from class A2
 Creating class B1 from A
 Hello from class B1
 Creating class B2 from A
 Hello from class B2
 Creating class B1 from B
 Hello from class B1
 Creating class B2 from B
 Hello from class B2
 A Object
 (
 [a1] => A1 Object
 (
 )
 
 [a2] => A2 Object
 (
 )
 
 [b1] => B1 Object
 (
 )
 
 [b2] => B2 Object
 (
 )
 
 )
 B Object
 (
 [b1] => B1 Object
 (
 )
 
 [b2] => B2 Object
 (
 )
 
 )
 Hello from class A1
 Hello from class A2
 Hello from class B1
 Hello from class B2
 Hello from class B1
 Hello from class B2
 
 Fatal error: Uncaught Error: Call to a member function sayHello() on null in _test/demo.php:61
 Stack trace:
 #0 {main}
 thrown in _test/demo.php on line 61
 */
 ?>
 |