17

祖父母メソッドを実行する (つまり、親メソッドをバイパスする) 必要がある場合があります。これはコードの匂いだとわかっていますが、他のクラス (フレームワーク、ライブラリなど) を変更できない場合があります。

PHPでは、次のようなものでそれを行うことができます:

call_user_func(array(get_parent_class(get_parent_class($childObject)), 'grandParentMethod'));

問題は、E_STRICT エラーを有効にすると、次のようなエラーが発生することです。

厳格な基準: 非静的メソッド GrandParent::grandParentMethod() は、静的に呼び出されるべきではありません ...

これに対する解決策は1つしか見つかりませんでした(E_STRICTを削除せずに)@。エラーを抑制するためにを追加するだけです。

しかし、それは本当に醜いです、誰かがより良い解決策を知っていますか?

ありがとう !PS: 次のような新しいオブジェクトをインスタンス化できません:

$grandparent = get_parent_class(get_parent_class($son));
$gp= new $grandparent;
$gp->grandParentMethod

$son のコンテキストで祖父母のメソッドを呼び出す必要があるためです。

4

4 に答える 4

2

ReflectionMethod->invoke() を使用できます

例:

<?php
class Grandpa {
    protected $age = 'very old';
    public function sayMyAge() {
        return 'sayMyAge() in Grandpa should be very old. ' . 
                  'My age is: ' . $this->age;
    }
}

class Pa extends Grandpa {
    protected $age = 'less old';
    public function sayMyAge() {
        return 'sayMyAge() in Pa should be less old. ' .
                  'My age is: ' . $this->age;
    }
}

class Son extends Pa {
    protected $age = 'younger';
    public function sayMyAge() {
        return 'sayMyAge() in Son should be younger. ' .
                  'My age is: ' . $this->age;
    }
}

$son = new Son();
$reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($son)), 
                                         'sayMyAge');
echo $reflectionMethod->invoke($son);
// returns:
// sayMyAge() in Grandpa should be very old. My age is: younger

注:呼び出されるメソッドは public である必要があります。

于 2012-10-12T02:43:06.367 に答える
1

別の内部メソッドを使用して (たとえば_doStuff、補数にdoStuff)、親を通じて孫から直接呼び出すことができます。

// Base class that everything inherits
class Grandpa  {
    protected function _doStuff() {
        // grandpa's logic
        echo 'grandpa ';
    }

    public function doStuff() {
        $this->_doStuff();
    }

}

class Papa extends Grandpa {
    public function doStuff() {
        parent::doStuff();
        echo 'papa ';
    }
}

class Kiddo extends Papa {
    public function doStuff() {
        // Calls _doStuff instead of doStuff
        parent::_doStuff();
        echo 'kiddo';
    }
}

$person = new Grandpa();
$person->doStuff();
echo "\n";
$person = new Papa();
$person->doStuff();
echo "\n";
$person = new Kiddo();
$person->doStuff();

ショー

grandpa
grandpa papa
grandpa kiddo
于 2013-05-10T09:22:03.940 に答える