1. ホーム
  2. php

[解決済み】trait関数をオーバーライドして、オーバーライドした関数から呼び出すには?

2022-03-24 13:51:09

質問

シナリオ

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

このコードは動作しません。また、継承されたようなtrait関数を呼び出す方法が見つかりません。私は 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);
    }
}

何も動作しません。

この機能を動作させる方法はありますか、それともこれよりはるかに複雑なtrait関数を完全にオーバーライドしなければなりませんか :)

解決方法は?

前作はもう少しでしたね。

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

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

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

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