Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

Traits ใน PHP

บทนำ

PHP ไม่รองรับ multiple inheritance (การสืบทอดหลายคลาส) ข้อจำกัดนี้ถูก克服บางส่วนโดยคุณสมบัติ traits มันเป็นกลไกการนำโค้ดกลับมาใช้ใหม่ (code reuse) การกำหนด trait คล้ายกับคลาส อย่างไรก็ตาม ไม่สามารถสร้างอินสแตนซ์โดยตรงได้ แทนที่จะ ฟังก์ชันการทำงานของ trait จะพร้อมใช้งานให้คลาสโดยคีย์เวิร์ด use ดังนั้น คลาสสามารถใช้เมธอดที่กำหนดใน trait ได้ หรือแม้แต่อย่าง override พวกมัน นอกเหนือจาก parent class ใดๆ ที่มันอาจสืบทอด

Trait ยังคล้ายกับ interface ความแตกต่างคือ interface ไม่ให้การกำหนดเมธอดภายใน ซึ่งต้องทำโดย implementing class เมธอดของ trait อย่างไรก็ตาม ให้การกำหนด ซึ่งอาจหรืออาจไม่ถูก override โดยคลาสที่ใช้ trait

รูปแบบไวยากรณ์

<?php trait testtrait{     public function test1(){         //body of method     } } //ใช้ trait class testclass{     use testtrait     //สมาชิกอื่นๆ ในคลาส } ?>

ตัวอย่าง

ในโค้ดต่อไปนี้ trait ที่มีสองเมธอดถูกใช้ในคลาสที่ override หนึ่งในเมธอด:

ตัวอย่าง

<?php //การกำหนด trait trait testtrait{     public function test1(){         echo "test1 method in trait\n";     }     public function test2(){         echo "test2 method in trait\n";     } } //ใช้ trait class testclass{     use testtrait;     public function test1(){         echo "test1 method overridden\n";     } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>

ผลลัพธ์

test1 method overridden test2 method in trait

Trait ในคลาสลูก (child class)

นี่คือข้อได้เปรียบหลักของ trait คลาสที่มี parent สามารถใช้ trait และเลือก override เมธอดของมันได้ ดังนั้นทำให้บรรลุ multiple inheritance ได้อย่างมีประสิทธิภาพ ตัวอย่างของคุณสมบัตินี้ด้านล่าง:

ตัวอย่าง

<?php //การกำหนด trait trait testtrait{     public function test1(){         echo "test1 method in trait\n";     } } //parent class class parentclass{     public function test2(){         echo "test2 method in parent\n";     } } //ใช้ trait และ parent class class childclass extends parentclass{     use testtrait;     public function test1(){         echo "parent method overridden\n";     }     public function test2(){         echo "trait method overridden\n";     } } $obj=new childclass(); $obj->test1(); $obj->test2(); ?>

ผลลัพธ์

parent method overridden trait method overridden

Trait กับ Interface

สามารถมีคลาสที่ implement interface, extend parent class อื่น และใช้ trait พร้อมกันได้:

ตัวอย่าง

<?php //การกำหนด trait trait mytrait{     public function test1(){         echo "test1 method in trait1\n";     } } class myclass{     public function test2(){         echo "test2 method in parent class\n";     } } interface myinterface{     public function test3(); } //ใช้ trait และ parent class class testclass extends myclass implements myinterface{     use mytrait;     public function test3(){         echo "implementation of test3 method\n";     } } $obj=new testclass(); $obj->test1(); $obj->test2(); $obj->test3(); ?>

ผลลัพธ์

test1 method in trait1 test2 method in parent class implementation of test3 method

การแก้ไขความขัดแย้ง (conflict resolution)

ถ้าคลาสใช้สอง traits ที่มีเมธอดร่วมกัน ความขัดแย้งของพวกมันถูกแก้ไขโดย scope resolution operator และคีย์เวิร์ด insteadof

ตัวอย่าง

<?php trait trait1{     public function test1(){         echo "test1 method in trait1\n";     }     public function test2(){         echo "test2 method in trait1\n";     } } trait trait2{     public function test1(){         echo "test1 method in trait2\n";     }     public function test2(){         echo "test2 method in trait2\n";     } } //ใช้ trait และ parent class class testclass {     use trait1, trait2{         trait1::test1 insteadof trait2;         trait2::test2 insteadof trait1;     } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>

ผลลัพธ์

test1 method in trait1 test2 method in trait2