PHP:如何调用类层次结构中同名的所有方法?

PHP:如何调用类层次结构中同名的所有方法?,php,inheritance,Php,Inheritance,我的类层次结构如下所示: class Alpha { public function initialize() { $class = get_class($this); $family = array( $class ); while( ($class = get_parent_class($class)) !== false ) { $family[] = $class; } $fa

我的类层次结构如下所示:

class Alpha {
    public function initialize() {
        $class = get_class($this);
        $family = array( $class );
        while( ($class = get_parent_class($class)) !== false ) {
            $family[] = $class;
        }
        $family = array_reverse($family);
        foreach($family as $className) {
            // call $className's start (instance) method
        }
    }

    public function start() {
        echo "calling start from Alpha\n";
    }
}

class Beta extends Alpha {
    public function start() {
        echo "calling start from Beta\n";
    }
}

class Charlie extends Beta {
    public function start() {
        echo "calling start from Charlie\n";
    }
}

$c = new Charlie();
$c->initialize();
Alpha的initialize方法应该调用派生类的start方法以及所有派生类的祖先类的start方法,直到Alpha的start方法。代码应产生以下输出:

calling start from Alpha
calling start from Beta
calling start from Charlie
但是,我似乎不知道如何调用$className变量指定的特定祖先类的实例方法


我使用了
call\u user\u func(数组($className,'start'))
,但这会导致start方法被视为静态函数。有什么想法吗?

类内函数调用,比如Classname::start应该调用Classname的函数start,而不是静态调用

class Alpha {
    public function initialize() {
        // ... call all 'start' methods in class hierarchy starting with highest level     class (Alpha's start method) and ending with lowest derived class
    }

    public function start() {
        echo "calling start from Alpha\n";
    }
}

class Beta extends Alpha {
    public function start() {
        echo "calling start from Beta\n";
        parent::start();
    }
}

class Charlie extends Beta {
    public function start() {
        echo "calling start from Charlie\n";
        parent::start();
    }

    public function initialize() {
        $this->start();
    }
}

$c = new Charlie();
$c->initialize();
class Alpha {

    public $myvar = 0;

    public function initialize() {

        $class = get_class($this);
        $family = array( $class );
        while( ($class = get_parent_class($class)) !== false ) {
            $family[] = $class;
            $this->myvar ++;
        }
        $family = array_reverse($family);
        foreach($family as $className) {
            // call $className's start method
            eval("{$className}::start();");
        }
    }

    public function start() {
        echo "{$this->myvar} calling start from Alpha\n";
    }
}

class Beta extends Alpha {
    public function start() {
        echo "{$this->myvar} calling start from Beta\n";
    }
}

class Charlie extends Beta {
    public function start() {
        echo "{$this->myvar} calling start from Charlie\n";
    }
}

$c = new Charlie();
$c->initialize();

类内函数调用,比如Classname::start应该调用Classname的函数start,而不是静态调用

class Alpha {

    public $myvar = 0;

    public function initialize() {

        $class = get_class($this);
        $family = array( $class );
        while( ($class = get_parent_class($class)) !== false ) {
            $family[] = $class;
            $this->myvar ++;
        }
        $family = array_reverse($family);
        foreach($family as $className) {
            // call $className's start method
            eval("{$className}::start();");
        }
    }

    public function start() {
        echo "{$this->myvar} calling start from Alpha\n";
    }
}

class Beta extends Alpha {
    public function start() {
        echo "{$this->myvar} calling start from Beta\n";
    }
}

class Charlie extends Beta {
    public function start() {
        echo "{$this->myvar} calling start from Charlie\n";
    }
}

$c = new Charlie();
$c->initialize();


这三个类是如何关联的?我根本看不到任何层次结构…为什么要避免
parent::start()
?这就是“等级制度”的运作方式。另外,在您的示例中,这三个类只是三个独立的类,这里没有“层次结构”。非常肯定,没有
parent::start()
,您就无法做到这一点
Alpha
不知道从中扩展了哪些类,我想你也无法对此进行查询。感谢Sergey理解我的意思,而不是我写的:)。对不起,各位,我更新了问题。我之所以要避免使用parent::start(),是因为我必须在所有类中使用它。我正在寻找只需要在基类中调用所有派生类的start方法的代码。我可能还有一个Delta、Elephant、Foxtrot等类。这三个类是如何关联的?我根本看不到任何层次结构…为什么要避免使用
parent::start()
?这就是“等级制度”的运作方式。另外,在您的示例中,这三个类只是三个独立的类,这里没有“层次结构”。非常肯定,没有
parent::start()
,您就无法做到这一点
Alpha
不知道从中扩展了哪些类,我想你也无法对此进行查询。感谢Sergey理解我的意思,而不是我写的:)。对不起,各位,我更新了问题。我之所以要避免使用parent::start(),是因为我必须在所有类中使用它。我正在寻找只需要在基类中调用所有派生类的start方法的代码。我可能还有一个Delta、Elephant、Foxtrot等类。其中一个要求是Alpha的initialize方法应该调用所有的start方法。其中一个要求是Alpha的initialize方法应该调用所有的start方法。为什么要使用
eval
::“
静态调用该方法,这与他不想要的
调用用户函数(数组($className,'start'))
相同。这确实有效。虽然我通常会尽量避免使用eval(),但如果我找不到另一种解决方案来允许我将start方法作为实例方法调用,我可能会采用这种方法。@threed:这种解决方案与
call_user_func(array($className,'start'))
,(或
call_user_func($className.::start')
)完全相同“Rocket,我想是这样的:用确切的父类调用函数也许这会有帮助(尽管有点混乱)。
::
运算符并不总是指示静态引用。为什么要使用
eval
::“
静态调用该方法,这与他不想要的
调用用户函数(数组($className,'start'))
相同。这确实有效。虽然我通常会尽量避免使用eval(),但如果我找不到另一种解决方案来允许我将start方法作为实例方法调用,我可能会采用这种方法。@threed:这种解决方案与
call_user_func(array($className,'start'))
,(或
call_user_func($className.::start')
)完全相同“Rocket,我想是这样的:用确切的父类调用函数也许这会有帮助(尽管有点混乱)。
运算符并不总是指示静态引用。