Jika ada kelas lain yang Anda perlukan untuk menggunakan fungsi hello() , Anda cukup menggunakan sifat Hello di kelas tersebut. Ini mengurangi duplikasi kode karena tidak perlu mendeklarasikan ulang metode yang sama berulang kali
Juga, Anda akan melihat bahwa kami menggunakan dua sifat dalam contoh di atas. Jika Anda menggunakan warisan untuk ini, memperluas banyak kelas tidak dimungkinkan
Bagian paling aneh untuk pemula di OOP adalah ada beberapa cara untuk melakukan hal yang sama. Bakat mencari tahu cara terbaik. Untuk mendapatkan keterampilan itu, Anda memerlukan pengetahuan yang baik tentang konsep-konsep ini, juga beberapa pengalaman dunia nyata
Jika Anda mempertimbangkan contoh di atas, Anda dapat menggunakan semua ini untuk membuatnya. pewarisan, abstraksi, antarmuka, dan sifat. Antarmuka tidak akan menjadi pilihan karena Anda perlu mendeklarasikan metode ini berulang kali. Jika pewarisan dan abstraksi digunakan, Anda harus mewarisi dua kali atau memiliki kedua metode di kelas induk yang sama. Jadi, sifat akan menjadi pilihan terbaik dalam kasus ini
Dengan cara yang sama, Anda akan menemukan masalah apa yang harus digunakan dalam situasi tertentu. Anda harus menjawab menggunakan pengetahuan dan pengalaman Anda
Sebelum kita membahas apa itu Traits di PHP, mari kita lihat dulu warisan PHP. Jika Anda terbiasa dengan PHP, terutama arsitektur OOP, maka tidak diragukan lagi Anda sepenuhnya menyadari bahwa PHP adalah salah satu bahasa di luar sana yang menerapkan pewarisan tunggal. Singkatnya, PHP tidak mendukung banyak pewarisan dan itulah sebabnya programmer PHP hanya dapat mewarisi kelas pada satu waktu menggunakan PHP…
Dalam 5. 4 Sifat versi PHP diperkenalkan ke pemrograman berorientasi objek PHP. Suatu sifat seperti kelas namun hanya untuk mengelompokkan metode dengan cara yang halus dan dapat diandalkan. Tidak diizinkan untuk memberi contoh suatu sifat sendiri. Ciri diperkenalkan ke PHP 5. 4 untuk mengatasi masalah pewarisan tunggal. Seperti yang kita ketahui di kelas pewarisan tunggal hanya dapat mewarisi dari satu kelas tunggal lainnya. Dalam kasus sifat, ini memungkinkan pengembang untuk menggunakan kembali kumpulan metode secara bebas di beberapa kelas independen yang tinggal di hierarki kelas yang berbeda
Contoh
add($var1,$var2) .""; echo "Ressult of multiplication:".$this->multiplication($var1,$var2); } } $o = new File(); $o->calculate(5,3); ?>
Keluaran
Result of addition two numbers:8 Result of multiplication of two numbers:15_Penjelasan
Dalam contoh di atas, kami telah mengimplementasikan fungsi dari dua sifat dalam satu kelas. Karena sifatnya, kami dapat mengakses banyak fungsi dalam satu kelas
Ringkasan. dalam tutorial ini, Anda akan mempelajari cara menggunakan ciri-ciri PHP untuk berbagi fungsionalitas di seluruh kelas independen, yang tidak berada dalam hierarki pewarisan yang sama
Pengantar ciri-ciri PHP
Penggunaan kembali kode adalah salah satu aspek terpenting dari pemrograman berorientasi objek. Di PHP, Anda menggunakan pewarisan untuk mengaktifkan penggunaan kembali kode di kelas yang berbeda dengan hierarki pewarisan yang sama
Untuk mencapai penggunaan kembali kode, Anda memindahkan fungsionalitas umum kelas ke metode kelas induk. Namun, warisan membuat kode digabungkan dengan sangat erat. Oleh karena itu, penggunaan warisan yang berlebihan dapat menyebabkan kode sangat sulit dipertahankan
Untuk mengatasi masalah ini, PHP 5. 4 memperkenalkan unit kode baru yang dapat digunakan kembali yang disebut trait. Ciri-ciri memungkinkan Anda untuk menggunakan kembali berbagai metode secara bebas di banyak kelas berbeda yang tidak perlu berada dalam hierarki kelas yang sama
Warisan memungkinkan kelas menggunakan kembali kode secara vertikal sementara sifat memungkinkan kelas menggunakan kembali kode secara horizontal
Sifat mirip dengan kelas, tetapi hanya untuk mengelompokkan metode dengan cara yang halus dan konsisten. PHP tidak mengizinkan Anda untuk membuat turunan dari Trait seperti turunan dari kelas. Dan tidak ada konsep turunan dari suatu sifat
Contoh Sifat PHP
Untuk mendefinisikan suatu sifat, Anda menggunakan kata kunci sifat diikuti dengan nama sebagai berikut
<?php trait Logger { public function log($msg) { echo '<pre>'; echo date('Y-m-d h:i:s') . ':' . '(' . __CLASS__ . ') ' . $msg . '<br/>'; echo '</pre>'; } }
Code language: HTML, XML (xml)Untuk menggunakan sifat di kelas, Anda menggunakan kata kunci use. Semua metode sifat tersedia di kelas tempatnya digunakan. Memanggil metode suatu sifat mirip dengan memanggil metode instan
Contoh berikut menunjukkan cara menggunakan sifat Logger di kelas
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)Dan Anda dapat menggunakan kembali sifat Logger di kelas
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)2 sebagai berikutclass User { use Logger; public function __construct() { $this->log('A new user created'); } }
Code language: PHP (php)_Kedua kelas
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)_0 danclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)2 menggunakan kembali metode dari sifat Logger, yang sangat fleksibelMenggunakan beberapa sifat
Kelas dapat menggunakan beberapa ciri. Contoh berikut menunjukkan cara menggunakan beberapa ciri di kelas IDE. Ini mensimulasikan model kompilasi C di PHP demi demonstrasi
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)_Menyusun beberapa sifat
PHP memungkinkan Anda menyusun beberapa sifat menjadi suatu sifat dengan menggunakan pernyataan use dalam deklarasi sifat. Misalnya
<?php trait Reader { public function read($source) { echo sprintf('Read from %s <br>', $source); } } trait Writer { public function write($destination) { echo sprintf('Write to %s <br>', $destination); } } trait Copier { use Reader, Writer; public function copy($source, $destination) { $this->read($source); $this->write($destination); } } class FileUtil { use Copier; public function copyFile($source, $destination) { $this->copy($source, $destination); } }
Code language: HTML, XML (xml)Bagaimana itu bekerja
- Pertama, tentukan sifat
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)_7 danclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)8 - Kedua, tentukan sifat baru yang disebut
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)_9 yang terdiri dariclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)7danclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
class User { use Logger; public function __construct() { $this->log('A new user created'); } }
Code language: PHP (php)_2 dari sifatclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)9, panggil metodeclass User { use Logger; public function __construct() { $this->log('A new user created'); } }
Code language: PHP (php)4 danclass User { use Logger; public function __construct() { $this->log('A new user created'); } }
Code language: PHP (php)5 dariclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)7 danclass BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)8 - Ketiga, gunakan sifat
class BankAccount { use Logger; private $accountNumber; public function __construct($accountNumber) { $this->accountNumber = $accountNumber; $this->log("A new $accountNumber bank account created"); } }
Code language: PHP (php)9 dalam metodeclass User { use Logger; public function __construct() { $this->log('A new user created'); } }
Code language: PHP (php)9 dari kelas<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)0 untuk mensimulasikan penyalinan file
Resolusi konflik metode sifat PHP
Melebihi metode sifat
Ketika sebuah kelas menggunakan banyak ciri yang memiliki nama metode yang sama, PHP akan memunculkan kesalahan fatal.
Untungnya, Anda dapat menginstruksikan PHP untuk menggunakan metode tersebut dengan menggunakan kata kunci
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)1. Sebagai contoh<?php trait FileLogger { public function log($msg) { echo 'File Logger ' . date('Y-m-d h:i:s') . ':' . $msg . '<br/>'; } } trait DatabaseLogger { public function log($msg) { echo 'Database Logger ' . date('Y-m-d h:i:s') . ':' . $msg . '<br/>'; } } class Logger { use FileLogger, DatabaseLogger{ FileLogger::log insteadof DatabaseLogger; } } $logger = new Logger(); $logger->log('this is a test message #1'); $logger->log('this is a test message #2');
Code language: HTML, XML (xml)Baik sifat
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)2 dan<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)3 memiliki metode<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)4 yang samaDi kelas Logger, kami menyelesaikan konflik nama metode dengan menetapkan bahwa metode
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)2 akan digunakan sebagai ganti dari<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)3Bagaimana jika Anda ingin menggunakan kedua metode
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)_4 dari sifat<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)2 dan<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)3?Metode sifat aliasing
Dengan menggunakan alias untuk nama metode yang sama dari beberapa sifat, Anda dapat menggunakan kembali semua metode dalam sifat tersebut
Anda menggunakan kata kunci
<?php trait Reader { public function read($source) { echo sprintf('Read from %s <br>', $source); } } trait Writer { public function write($destination) { echo sprintf('Write to %s <br>', $destination); } } trait Copier { use Reader, Writer; public function copy($source, $destination) { $this->read($source); $this->write($destination); } } class FileUtil { use Copier; public function copyFile($source, $destination) { $this->copy($source, $destination); } }
Code language: HTML, XML (xml)_2 untuk alias metode suatu sifat ke nama yang berbeda di dalam kelas yang menggunakan sifat tersebutContoh berikut mengilustrasikan bagaimana metode sifat alias untuk menyelesaikan konflik nama metode
class Logger { use FileLogger, DatabaseLogger{ DatabaseLogger::log as logToDatabase; FileLogger::log insteadof DatabaseLogger; } } $logger = new Logger(); $logger->log('this is a test message #1'); $logger->logToDatabase('this is a test message #2');
Code language: PHP (php)Metode
<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)4 dari kelas<?php trait Preprocessor { public function preprocess() { echo 'Preprocess...done' . '<br/>'; } } trait Compiler { public function compile() { echo 'Compile code.. done' . '<br/>'; } } trait Assembler { public function createObjCode() { echo 'Create the object code files.. done.' . '<br/>'; } } trait Linker { public function createExec() { echo 'Create the executable file...done' . '<br/>'; } } class IDE { use Preprocessor, Compiler, Assembler, Linker; public function run() { $this->preprocess(); $this->compile(); $this->createObjCode(); $this->createExec(); echo 'Execute the file...done' . '<br/>'; } } $ide = new IDE(); $ide->run();
Code language: HTML, XML (xml)3 memiliki nama baru (<?php trait Reader { public function read($source) { echo sprintf('Read from %s <br>', $source); } } trait Writer { public function write($destination) { echo sprintf('Write to %s <br>', $destination); } } trait Copier { use Reader, Writer; public function copy($source, $destination) { $this->read($source); $this->write($destination); } } class FileUtil { use Copier; public function copyFile($source, $destination) { $this->copy($source, $destination); } }
Code language: HTML, XML (xml)5) dalam konteks kelas LoggerDalam tutorial ini, Anda telah mempelajari cara menggunakan ciri-ciri PHP untuk menggunakan kembali kode di luar hierarki kelas