1

みんな私はこの基本的な構造を持っています:

interface IModule {
    public function _prepareActionObj ();
}

abstract class Module implements IModule {

    private $_action = null,

            $_actionObj = null,

            $_actionHandlers = array();

    public function __construct() {
        $this->_action = GetParamDefault('action', '');
        $this->_prepareActionObj();
    }

    private function _prepareActionObj () {
        $this->_actionObj = new $this->_actionHandlers[$this->_action]();
    }

}

これまでのところ、奇妙なことは何もありません。しかし、私がこれを行うと:

 class AdminHomeModule extends Module {
     private
         $_actionHandlers = array(
             '' => 'AdminModuleHomeAction'
         );
 }

AdminHomeModule の新しいインスタンスを作成すると、このエラーが発生します

Undefined index: on line 22 in ....\interfaces\IModule.php

まさに

$this->_actionObj = new $this->_actionHandlers[$this->_action]();

モジュールコンストラクターで $this をダンプすると、これが得られます

AdminHomeModule Object
(
    [_actionHandlers:AdminHomeModule:private] => Array
        (
            [] => AdminModuleHomeAction
        )

    [_action:Module:private] => 
    [_actionObj:Module:private] => 
    [_actionHandlers:Module:private] => Array
        (
        )

)

ご覧のとおり、_actionHandlers の 2 つのインスタンスを取得します。1 つは親クラス用で、もう 1 つは Module を拡張する現在のクラスからのものです。_actionHandlers が 2 つある理由がわかりません。子クラスで宣言するときに上書きすべきではありません。現在 _prepareActionObject が間違った場所を探しており、この厄介なエラーが発生するためです...

4

1 に答える 1

1

これは意図された動作です。privateクラス初期化子は、そのクラスのみがこのプロパティへのアクセスを許可されることを意味します。クラスが。の場合、これは変更されませんabstract

代わりにできることは、抽象クラス初期化子と継承クラスを保護されていると宣言することです。そうすれば、すべての継承クラスが同じプロパティにアクセスできるようになります。

abstract class Module implements IModule {

    protected $_action = null,

            $_actionObj = null,

            $_actionHandlers = array();

    public function __construct() {
        $this->_action = GetParamDefault('action', '');
        $this->_prepareActionObj();
    }

    private function _prepareActionObj () {
        $this->_actionObj = new $this->_actionHandlers[$this->_action]();
    }

}

class AdminHomeModule extends Module {
    proteced
        $_actionHandlers = array(
            '' => 'AdminModuleHomeAction'
        );
}

編集:私の間違い、私はコードを適切にレビューせずにアドバイスを与えていました...

[ここにあったものを編集しました]

于 2013-01-19T07:10:33.750 に答える