Skenario:
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
Kode ini tidak berfungsi, dan saya tidak dapat menemukan cara untuk memanggil fungsi sifat seperti itu diwarisi. Aku mencoba menelepon self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
dan berikut ini:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
Tidak ada yang berhasil.
Apakah ada cara untuk membuatnya berfungsi atau harus saya timpa sepenuhnya fungsi trait yang jauh lebih kompleks dari ini :)
A::calc(1)
Jika kelas mengimplementasikan metode secara langsung, itu tidak akan menggunakan versi ciri. Mungkin yang Anda pikirkan adalah:
Karena kelas anak tidak mengimplementasikan metode secara langsung, mereka akan terlebih dahulu menggunakan sifat tersebut jika ada yang menggunakan kelas induk.
Jika Anda ingin, sifat tersebut dapat menggunakan metode di kelas induk (dengan asumsi Anda tahu metode itu akan ada di sana) misalnya
Anda juga dapat menyediakan cara untuk menimpa, tetapi masih mengakses metode sifat sebagai berikut:
Anda dapat melihatnya berfungsi di http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5
sumber
Pendekatan alternatif jika tertarik - dengan kelas menengah tambahan untuk menggunakan cara OOO normal. Ini menyederhanakan penggunaan dengan parent :: methodname
sumber
trait
s. Seperti menggabungkan beberapa sifat dalam beberapa kelas (misalnya sifat A, B di kelas, sifat B, C, D di kelas lain, sifat A, C di kelas lain dan sebagainya)ScreenablePerson::save()
ada,Candidate
menggunakanValidating
sifat dan meluasScreenablePerson
, dan ketiga kelas milikisave()
.Menggunakan sifat lain:
sumber