[php] Wie kann man die Merkmalsfunktion außer Kraft setzen und sie von der überschriebenen Funktion aufrufen?


Answers

Wenn die Klasse die Methode direkt implementiert, wird sie nicht die Merkmalversion verwenden. Vielleicht, was du denkst, ist:

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

class MyClass {
    function calc($v) {
        return $v+2;
    }
}

class MyChildClass extends MyClass{
}

class MyTraitChildClass extends MyClass{
    use A;
}

print (new MyChildClass())->calc(2); // will print 4

print (new MyTraitChildClass())->calc(2); // will print 3

Da die untergeordneten Klassen die Methode nicht direkt implementieren, verwenden sie zuerst die Eigenschaft, wenn sie andernfalls die der übergeordneten Klasse verwenden.

Wenn Sie möchten, kann das Merkmal Methode in der Elternklasse verwenden (vorausgesetzt, Sie wissen, dass die Methode dort wäre) z

trait A {
    function calc($v) {
        return parent::calc($v*3);
    }
}
// .... other code from above
print (new MyTraitChildClass())->calc(2); // will print 8 (2*3 + 2)

Sie können auch Möglichkeiten zum Überschreiben bereitstellen, aber weiterhin auf die Merkmalsmethode wie folgt zugreifen:

trait A {
    function trait_calc($v) {
        return $v*3;
    }
}

class MyClass {
    function calc($v) {
        return $v+2;
    }
}


class MyTraitChildClass extends MyClass{
    use A {
      A::trait_calc as calc;
    }
}


class MySecondTraitChildClass extends MyClass{
    use A {
      A::trait_calc as calc;
    }

    public function calc($v) {
      return $this->trait_calc($v)+.5;
    }
}


print (new MyTraitChildClass())->calc(2); // will print 6
echo "\n";
print (new MySecondTraitChildClass())->calc(2); // will print 6.5

Sie können es bei http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5

Question

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 Merkmalsfunktion so aufzurufen, wie sie vererbt wurde. Ich habe versucht, self::calc($v) , static::calc($v) , parent::calc($v) , A::calc($v) und folgendes zu nennen:

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 einen Weg, um es funktionieren zu lassen oder muss ich die Merkmalsfunktion vollständig überschreiben, die viel komplexer ist als das :)




Ein anderes Merkmal verwenden:

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

class A {
    use ATrait;
}

trait BTrait {
    function calc($v) {
        $v++;
        return parent::calc($v);
    }
}

class B extends A {
    use BTrait;
}

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





Links



Tags

php php   traits