Сценарий:
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);
}
}
Ничего не работает
Есть ли способ заставить его работать или я должен полностью переопределить функцию trait, которая намного сложнее, чем эта :)
A::calc(1)
Если класс реализует метод напрямую, он не будет использовать версию признаков. Возможно, вы думаете о:
Поскольку дочерние классы не реализуют метод напрямую, они сначала будут использовать этот признак, если в противном случае используется родительский класс.
Если вы хотите, эта черта может использовать метод в родительском классе (если вы знаете, что метод будет там), например
Вы также можете указать способы переопределения, но при этом использовать метод trait следующим образом:
Вы можете увидеть, как это работает по адресу http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
источник
Альтернативный подход, если интересно - с дополнительным промежуточным классом использовать обычный способ ООО. Это упрощает использование с parent :: methodname
источник
trait
s. Как объединение нескольких черт в нескольких классах (например, черта A, B в классе, черта B, C, D в другом классе, черта A, C в другом классе и т. Д.)ScreenablePerson::save()
существует,Candidate
используетValidating
черту и расширяетScreenablePerson
, и все три класса имеютsave()
.Используя другую черту:
источник