Dan Anda ingin menambahkan beberapa perubahan pada metode ini. Anda dapat mencoba menimpanya dan menggunakan struktur parent:: seperti ini
class SomeClass { use SomeTrait; public function increment(int $value): int { if ($value === 2) { return 0; } return parent::increment($value); } } $some = new SomeClass(); var_dump($some->increment(1));Tapi itu akan gagal dengan kesalahan seperti Cannot access parent:: when current class scope has no parent. Itu karena sifat bukanlah kelas, perilakunya berbeda. Untuk membuatnya berfungsi, Anda dapat menggunakan solusi berikutnya
Jika kelas mengimplementasikan metode secara langsung, itu tidak akan menggunakan versi ciri. Mungkin yang Anda pikirkan adalah
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_Karena kelas anak tidak mengimplementasikan metode secara langsung, mereka pertama-tama akan menggunakan sifat jika ada yang menggunakan kelas induk
Jika Anda mau, sifat itu bisa menggunakan metode di kelas induk (dengan asumsi Anda tahu metode itu ada di sana) e. g
Saya mengalami situasi baru-baru ini di mana saya ingin mengubah tanda tangan metode untuk metode yang disuntikkan ke dalam kelas melalui suatu sifat, yaitu mengubah parameter default. Saya ingin melakukan ini jadi saya tidak perlu meneruskan parameter default baru di setiap tempat yang saya panggil metode ini di kelas khusus ini
Mengesampingkan metode, cukup mudah. Segera setelah metode baru dideklarasikan di kelas dengan nama yang sama, metode sifat akan diganti. Bagian yang sulit adalah memanggil metode 'induk' dari metode 'anak', jadi saya tidak perlu menduplikasi logika di dalam metode baru saya. Saya mencoba parent::methodName() dan TraitName::methodName() sebelum lari ke mesin google untuk mempelajari cara yang tepat untuk melakukan ini
Ternyata semudah membuat alias untuk nama metode sifat dalam pernyataan "Gunakan", yang masuk akal setelah saya melihatnya
Jadi, jika ini adalah sifat yang ingin Anda gunakan dan timpa
trait SomeTrait { public function someMethod(string $key = 'Id') { // logic return $resultOfLogic; } }Berikan saja alias pada nama metode sifat saat "Menggunakan" sifat tersebut
use SomeTrait {someMethod as public traitSomeMethod;}
Ini contoh lengkapnya
Jadi sekarang saya bisa memanggil metode ini pada contoh apa pun dari kelas ini tanpa secara eksplisit meneruskan default $key setiap kali saya perlu memanggilnya. Juga, saya mendapat manfaat tambahan karena tidak harus menduplikasi logika, menjaga semuanya tetap KERING dan memastikan bahwa setiap perubahan yang dilakukan pada logika sifat akan 'menggelembung' ke implementasi kelas yang konkret.
Pertimbangkan contoh ini, ketika kita memiliki sifat dan kelas yang menggunakan sifat ini. Tapi kami ingin mengganti metode suatu sifat dan juga kami ingin memanggil metode sifat awal. Bagaimana kita bisa melakukannya?
<?php trait Calculates { function calc($value) { return $v + 1; } } class Calculator { use Calculates { } function calc($value) { $v++; // call trait's method } }_Kita dapat menggunakan mekanisme penyelesaian konflik sifat. Kita dapat mengganti nama metode sifat dengan menggunakan kata kunci as. Kami juga dapat mengubah visibilitasnya untuk menghapusnya dari antarmuka publik kelas
<?php trait Calculates { function calc($value) { return $v + 1; } } class Calculator { use Calculates { calc as protected calculate; } function calc($value) { $v++; return $this->calculate($this); } }Sekarang, ini berhasil