2

次のようなクラス階層があります。

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 メソッドと、Alpha の start メソッドに至るすべての派生クラスの祖先クラスの start メソッドを呼び出す必要があります。コードは次の出力を生成する必要があります。

calling start from Alpha
calling start from Beta
calling start from Charlie

しかし、$className 変数で指定された特定の祖先クラスのインスタンス メソッドを呼び出す方法がわかりません。

私は使用しましcall_user_func(array($className, 'start'))たが、これにより start メソッドが静的関数のように扱われます。何か案は?

4

2 に答える 2

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();
于 2012-05-12T05:38:15.387 に答える
2

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();
于 2012-05-12T07:27:15.037 に答える