我有一个类层次结构,如下所示:
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_user_func(array($className, 'start'))
但这会导致start方法被视为静态函数。有什么想法吗?
答案 0 :(得分:2)
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();
答案 1 :(得分:2)
在类函数调用中,如Classname :: start应该调用Classname的函数start not static call
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();