466 Stimmen

Wie überschreibt man eine Trait-Funktion und ruft sie von der überschriebenen Funktion aus auf?

Szenario:

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

Dieser Code funktioniert nicht, und ich kann keine Möglichkeit finden, eine Trait-Funktion aufzurufen, wie sie vererbt wurde. Ich habe versucht, aufzurufen self::calc($v) , static::calc($v) , parent::calc($v) , A::calc($v) und die folgenden:

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

class MyClass {
    use A {
        calc as traitcalc;
    }

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

Nichts funktioniert.

Gibt es eine Möglichkeit, um es zu machen, oder muss ich vollständig überschreiben die Trait-Funktion, die viel komplexer als diese ist :)

0voto

Razor Mureithi Punkte 193

Dies ist im Grunde ein Hark, aber wenn der Trait Teil Ihres Codes und kein Paket ist, können Sie eine Funktion haben, die prüft, ob eine andere Funktion existiert und diese anstelle der aktuellen Funktion zurückgibt.

trait A {
    function calc($v) {
        if(method_exists($this, 'calcClass'))
        {
          $this->calcClass($v)
        }
        return $v+1;
    }
}

class MyClass {
    use A;

    function calcClass($v) {
        return $v+2;;
    }
}

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

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X