特性関数をオーバーライドしてオーバーライドされた関数から呼び出すにはどうすればよいでしょうか? 質問する

特性関数をオーバーライドしてオーバーライドされた関数から呼び出すにはどうすればよいでしょうか? 質問する

シナリオ:

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    use A;

    function calc($v) {
        $v++;
        return A::calc($v);
    }
}

print (new MyClass())->calc(2); // should print 4

このコードは機能せず、継承されたかのように特性関数を呼び出す方法が見つかりません。、、、および次の呼び出しをself::calc($v)試しましたstatic::calc($v)parent::calc($v)A::calc($v)

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    use A {
        calc as traitcalc;
    }

    function calc($v) {
        $v++;
        return traitcalc($v);
    }
}

何も機能しません。

これを動作させる方法はありますか、それともこれよりもはるかに複雑な特性関数を完全にオーバーライドする必要がありますか :)

ベストアンサー1

最後のものはほぼ完成していました:

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    use A {
        calc as protected traitcalc;
    }

    function calc($v) {
        $v++;
        return $this->traitcalc($v);
    }
}

特性はクラスではありません。そのメンバーに直接アクセスすることはできません。基本的には、自動化されたコピー アンド ペーストだけです...

おすすめ記事