<?php
class 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 ();
?>
php用反射实现多继承
最新推荐文章于 2021-03-26 11:38:16 发布