0

コードサンプルは、私が取り組んでいることの簡単な例です。PHPには2つのクラスがあります。

class Wrap {

    public function wrapA($arg){
        return 'A'.$arg.'A';
    }

    public function wrapB($arg){
        return 'B'.$arg.'B';
    }

}

class Child extends Wrap {

    public $OUT;

    public function wrapA($arg){
        $this->OUT .= parent::wrapA($arg);
    }

    public function wrapB($arg){
        $this->OUT .= parent::wrapB($arg);
    }

    public function __destruct(){
        echo $this->OUT;
    }

}

$X = new Child();

$X->wrapA(
    $X->wrapB('CC')
);

ここでの出力は「BCCBAA」です。しかし、私が達成しようとしているのは「ABCCBA」です。「Wrap」クラスはこの形式でなければなりません。

…そして、次のメソッド呼び出しがある場合:

$X->wrapB( $X->wrapA('1') );

$X->wrapA( $X->wrapB('aa') .$X->wrapA('bbb') .$X->wrapB( $X->wrapA('cccc') ) );

… 次の出力が必要です: BA1ABABaaBAbbbABAcccABA

他の方法はありますか?

また、Wrap-Class を (Child なしで) 単独で動作させたいと考えています。これが、メソッドに戻り値がある理由です。

しかし、Child-Class では戻り値を変数に書きたいと思います。

THXお早めに!

4

2 に答える 2

3

これ$X->wrapB('CC')は、何も返さず、$X->wrapA()呼び出されるまでに空の文字列にキャストされるため、A何もラップされないためです。

ただし、に追加BCCBするため$X->OUT、を呼び出す$X->wrapA()までに、に追加AAされ、になりBCCBAAます。

もう一度質問を見てみると、別の方法で解決する必要があると思います。これは考慮すべきことです:

class Wrap
{
    // The wrapping itself can be declared as a static method
    protected static function wrapWithChar($arg, $ch)
    {
        return $ch . $arg . $ch;
    }
}

class Child extends Wrap
{
    protected $OUT;

    // we allow the internal state to be set upon construction
    public function __construct($s = '')
    {
        $this->OUT = $s;
    }

    // no arguments required here, this gets applied on the internal state
    public function wrapA()
    {
        $this->OUT = self::wrapWithChar($this->OUT, 'A');
        // return instance to allow chaining
        return $this;
    }

    public function wrapB()
    {
        $this->OUT = self::wrapWithChar($this->OUT, 'B');
        return $this;
    }

    public function __toString()
    {
        return $this->OUT;
    }

    public function __destruct(){
        echo $this->OUT;
    }

}

// initialize with 'CC'    
$X = new Child('CC');

// wrap B around it; becomes 'BCCB'
$X->wrapB();
// wrap A around that; becomes 'ABCCBA'
$X->wrapA();

// example of chaining
$Y = new Child('ZZ');
// wrap B then A around it; becomes 'ABZZBA'
$Y->wrapB()->wrapA();

古い答え

実行できるChildものとして表示するには、魔法の方法を使用できます(使用する方がより明示的ですが、もう少し作業が必要になります)。Wrap__toString()instanceof

class Child extends Wrap
{
    public $OUT;

    public function wrapA($arg)
    {
        $this->OUT = parent::wrapA($arg);
        return $this;
    }

    public function wrapB($arg)
    {
        $this->OUT = parent::wrapB($arg);
        return $this;
    }

    public function __toString()
    {
        return $this->OUT;
    }

    public function __destruct(){
        echo $this->OUT;
    }
}

wrapX()メソッドはインスタンス自体を返すよう__toString()になり、ラップする必要があるときはいつでも呼び出されます。

上記は正しい結果を生成します。

于 2012-10-16T09:43:03.380 に答える