Bagaimana Anda membuat ciri-ciri di php?

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"); } }

Code language: PHP (php)
0

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 berikut

class 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 dan

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 menggunakan kembali metode dari sifat Logger, yang sangat fleksibel

Menggunakan 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 dan

    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)
    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 dari

    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)
    7dan

    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)
    8 sifat. Dalam metode

    class User { use Logger; public function __construct() { $this->log('A new user created'); } }

    Code language: PHP (php)
    _2 dari 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, panggil metode

    class User { use Logger; public function __construct() { $this->log('A new user created'); } }

    Code language: PHP (php)
    4 dan

    class User { use Logger; public function __construct() { $this->log('A new user created'); } }

    Code language: PHP (php)
    5 dari

    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 dan

    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)
    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  metode

    class 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 sama

Di 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();

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 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)
3

Bagaimana 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 tersebut

Contoh 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 Logger

Dalam tutorial ini, Anda telah mempelajari cara menggunakan ciri-ciri PHP untuk menggunakan kembali kode di luar hierarki kelas

Bagaimana cara membuat sifat di PHP?

Contoh Dijelaskan . pesan1. declare one trait: message1. Lalu, kita membuat kelas. Selamat datang. Kelas menggunakan sifat tersebut, dan semua metode dalam sifat tersebut akan tersedia di kelas. Jika kelas lain perlu menggunakan fungsi msg1(), cukup gunakan sifat message1 di kelas tersebut.

Bisakah kita membuat objek sifat di PHP?

PHP tidak mengizinkan Anda membuat turunan Trait seperti turunan kelas. Dan tidak ada konsep turunan dari suatu sifat.

Apa ciri-ciri PHP dan bagaimana Anda menggunakannya?

Dalam PHP, sifat adalah cara untuk memungkinkan pengembang menggunakan kembali metode kelas independen yang ada dalam hierarki pewarisan yang berbeda . Sederhananya, sifat memungkinkan Anda membuat metode yang diinginkan dalam pengaturan kelas, menggunakan kata kunci sifat. Anda kemudian dapat mewarisi kelas ini melalui penggunaan kata kunci.

Apa yang dimaksud dengan sifat dalam PHP?

Sifat adalah mekanisme penggunaan ulang kode dalam bahasa warisan tunggal seperti PHP . Trait dimaksudkan untuk mengurangi beberapa batasan warisan tunggal dengan memungkinkan pengembang untuk menggunakan kembali set metode secara bebas di beberapa kelas independen yang tinggal di hierarki kelas yang berbeda.