php用反射实现多继承

来源:互联网 发布:软件服务费合同模板 编辑:程序博客网 时间:2024/05/16 07:57
<?phpclass multi_extends {public function __construct() {$this->_init_extends ();}protected function _init_extends() {if (property_exists ( $this, '_extends' )) {$extends = &$this->_extends;foreach ( $extends as $class ) {$this->_extends ( $class );}}}public function _extends($class_name) {// 分析目标$ref = new ReflectionClass ( $class_name );// 继承公共属性$property_list = $ref->getProperties ( ReflectionProperty::IS_PUBLIC );foreach ( $property_list as $property ) {$property_name = $property->name;$property_value = $property->getValue ( new $class_name () );if ($property_name === '_extends') {foreach ( $property_value as $c ) {$this->_extends [] = $c;}} else {if (! property_exists ( $this, $property_name )) {$this->{$property->name} = $property_value;}}}// 继承公共方法$method_list = $ref->getMethods ( ReflectionMethod::IS_PUBLIC );foreach ( $method_list as $method ) {$this->_extends_method [$method->name] = $method->class;}}function __call($m, $a) {if ($c = $this->_extends_method [$m]) {eval ( "$c::$m(" . '$a' . ");" );}}}header ( 'content-type:text/html;charset=utf-8' );class a {public $a = 5;public function say_name() {echo '我叫' . $this->name . '<br>';}}class b {function say_age() {echo '我今年' . $this->age . '岁<br>';}}class c extends multi_extends {public $_extends = array ('a','b' );public function say_hellow() {echo 'hellow ' . $this->name . '<br>';}}class d {function say_goodbye() {echo 'goodbye ' . $this->name . '<br>';}}class persion extends multi_extends {public $_extends = array ('c','d' );public $name = "熊宝山";public $age = "20";}// 执行继承后的方法$o = new persion ();$o->say_name ();$o->say_age ();$o->say_hellow ();$o->say_goodbye ();?>

0 0
原创粉丝点击