Pengantar Trait
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 51 dari 91.
PHP hanya mendukung pewarisan tunggal, sebuah class hanya dapat mewarisi satu class induk. Namun, bagaimana jika kamu perlu berbagi fungsionalitas di beberapa class yang tidak saling berkaitan? Di sinilah trait berperan.
Trait adalah mekanisme untuk menggunakan ulang kode yang memungkinkan kamu mendefinisikan method dan property yang dapat disisipkan ke dalam beberapa class. Anggap trait sebagai salin-tempel pada tingkat bahasa, kode dari trait menjadi bagian dari class yang menggunakannya.
<?php
trait Timestampable {
private string $createdAt;
public function setCreatedAt(): void {
$this->createdAt = date('Y-m-d H:i:s');
}
public function getCreatedAt(): string {
return $this->createdAt;
}
}
class Article {
use Timestampable;
public function __construct(public string $title) {
$this->setCreatedAt();
}
}
$article = new Article("PHP Traits");
echo $article->getCreatedAt();
Kata kunci use di dalam class mengimpor anggota trait. Sekarang Article dapat mengakses setCreatedAt() dan getCreatedAt() seolah-olah keduanya didefinisikan langsung di dalam class.
Trait yang sama dapat digunakan di class yang sama sekali tidak terkait, seperti class Comment, class User, atau class lain yang memerlukan fungsi timestamp. Ini mengatasi keterbatasan pewarisan tunggal dengan memungkinkan berbagi kode secara horizontal di seluruh hierarki class kamu.
Tantangan
MudahMari kita buat sistem sapaan sederhana yang menunjukkan cara trait memungkinkan kamu berbagi fungsionalitas di antara class yang tidak berkaitan. Kamu akan membuat trait yang menyediakan kemampuan untuk memberi sapaan, lalu menggunakannya di dua class yang sama sekali berbeda.
Kamu akan mengatur kodemu dalam tiga file:
Greetable.php: Buat trait bernamaGreetableyang menyediakan fungsionalitas sapaan. Trait ini harus memiliki:- Property privat
$greeting(string) - Method
setGreeting(string $greeting)yang menyimpan pesan sapaan - Method
greet()yang mengembalikan pesan sapaan
- Property privat
Person.php: Buat classPersonyang menggunakan traitGreetable. Sertakan file trait dan gunakan promosi constructor untuk mendefinisikan property publik$name. Di dalam constructor, panggilsetGreeting()untuk menetapkan sapaan menjadi"Hello, I'm [name]".Robot.php: Buat classRobotyang juga menggunakan traitGreetable. Sertakan file trait dan gunakan promosi constructor untuk mendefinisikan property publik$model. Di dalam constructor, panggilsetGreeting()untuk menetapkan sapaan menjadi"Beep boop, I am model [model]".
Di main.php, sertakan kedua file class. Kamu akan menerima dua input: nama seseorang dan nomor model robot. Buat instance dari kedua class dan cetak sapaan masing-masing pada baris terpisah.
Ini menunjukkan kekuatan trait: Person dan Robot adalah class yang sama sekali tidak berkaitan dan tidak memiliki parent yang sama, tetapi keduanya memperoleh fungsionalitas sapaan yang sama melalui trait. Setiap class menyesuaikan cara menggunakan fungsionalitas tersebut dengan caranya sendiri.
Coba sendiri
<?php
require_once 'Person.php';
require_once 'Robot.php';
// Baca input
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));
// TODO: Buat instance Person dengan nama yang diberikan
// TODO: Buat instance Robot dengan model yang diberikan
// TODO: Tampilkan salam dari Person
// TODO: Tampilkan salam dari Robot (di baris baru)
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online