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

PHP ลักษณะ


แนะนำตัว

PHP ไม่รองรับการสืบทอดหลายรายการ ข้อจำกัดนี้เอาชนะได้ด้วยคุณลักษณะของลักษณะ . เป็นกลไกของการใช้รหัสซ้ำ คำจำกัดความของลักษณะคล้ายกับคลาส อย่างไรก็ตาม ไม่สามารถสร้างอินสแตนซ์ได้โดยตรง แทนที่จะใช้ฟังก์ชันของคุณลักษณะในชั้นเรียนโดย ใช้ คำสำคัญ. ดังนั้นคลาสสามารถใช้เมธอดที่กำหนดไว้ในลักษณะหรือสามารถแทนที่ได้ นี่เป็นนอกเหนือจากคลาสหลักอื่น ๆ ที่อาจสืบทอดมา

ลักษณะยังคล้ายกับอินเทอร์เฟซ ความแตกต่างคืออินเทอร์เฟซไม่ได้ให้คำจำกัดความของเมธอดภายใน ซึ่งต้องทำโดยใช้คลาส อย่างไรก็ตาม วิธีการของ Trait จะให้คำจำกัดความ ซึ่งอาจจะหรืออาจจะไม่ถูกแทนที่โดยคลาสที่ใช้คุณลักษณะนี้

ไวยากรณ์

<?php
trait testtrait{
   public function test1(){
      //body of method
   }
}
//using trait
class testclass{
   use testtrait
   //rest of members in class
}
?>

ตัวอย่าง

ในโค้ดต่อไปนี้ คุณลักษณะที่มีสองวิธีถูกใช้ในคลาสที่แทนที่หนึ่งในเมธอด

ตัวอย่าง

<?php
//definition of trait
trait testtrait{
   public function test1(){
      echo "test1 method in trait\n";
   }
   public function test2(){
      echo "test2 method in trait\n";
   }
}
//using 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 และอาจเลือกที่จะแทนที่เมธอดของมัน จึงได้รับมรดกหลายอย่างอย่างมีประสิทธิภาพ ตัวอย่างของคุณลักษณะนี้ได้รับด้านล่าง −

ตัวอย่าง

<?php
//definition of 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";
   }
}
//using trait and 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 พร้อมกัน

ตัวอย่าง

<?php
//definition of 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();
}
//using trait and 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

การแก้ไขข้อขัดแย้ง

ถ้าคลาสใช้สองลักษณะที่มีเมธอดร่วมกัน ข้อขัดแย้งจะได้รับการแก้ไขโดยตัวดำเนินการแก้ไขขอบเขตและแทน คีย์เวิร์ด

ตัวอย่าง

<?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";
   }
}
//using trait and 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