Ngô Tôn sẽ tiếp tục gửi tới các bạn bài viết về lập trình hướng đối tượng trong PHP, đó chính là “Abstract và Interface”. Mình xin chia sẻ 1 bài viết được trình bày chi tiết và dễ hiểu nhất để giải thích cho mọi người tường tận ngóc ngách của vấn đề để những ai đã và đang băn khoăn về lớp trừu tượng và giao diện trong PHP.
1. Lớp trừa tượng (abstract) OOP
Lớp trừu tượng (abtract) là gì? Lớp trừu tượng cũng có thể hiểu rằng đó chính là một lớp:
- Lớp này sẽ bao gồm những phương thức trừu tượng.
- Những lớp khác sau khi kế thừa lớp trừu tượng sẽ cần phải định nghĩa những phương thức trừu tượng đó.
- Mỗi một class chỉ có khả năng kế thừa một lớp trừu tượng.
Ví dụ :
1 2 3 4 5 6 7 8 9 |
<?php //Định nghĩa lớp trừu tượng động vật có vú abstract class Mamal{ //Định nghĩa các phương thức chung của lớp Mamal abstract public function setAge($age); abstract public function getAge(); abstract public function eat($food); } ?> |
Lúc này bạn có thể hiểu như sau: lớp Mamal được gọi là lớp trừu tượng và những phương thức setAge($age), getAge($age) hay eat($food) chính là những phương thức trừu tượng. Và khi 1 lớp nào đó muốn dùng lớp trừu tượng, thì nó cần phải kế thừa sử dụng từ khóa extends
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php //Định nghĩa lớp trừu tượng động vật có vú abstract class Mamal{ //Định nghĩa các phương thức chung của lớp Mamal abstract public function setAge($age); abstract public function getAge(); abstract public function eat($food){ echo "Bạn muốn ăn gì?"; } } class Person extends Mammal { protected $job_; public function setAge($age){ $this->age_ = $age; } public function getAge(){ return $this->age_; } public function eat($food){ echo 'Tôi muốn ăn chay ngày hôm nay'; } public function setJob($job){ $this->job_ = $job; } public function getJob(){ echo 'Công việc của tôi là '.$this->job_; } } ?> |
Phân tích quá ví dụ trên, ta có thể thấy rằng, khi 1 lớp đó là Person kế thừa lại lớp Mamal thì nó cần phải định nghĩa lại những phương thức có trong lớp trừu tượng Mamal như : setAge(), getAge(), eat(). Ngoài ra thì class Person cũng sẽ tự định nghĩa cho mình những phương thức khác như là setJob(), getJob,…
Đến đây thì bạn đã có thể hình dung rõ ràng hơn về lớp trừu tượng rồi đúng không? Nếu vẫn chưa hình dung rõ thì các bạn cần ghi nhớ lại những điều sau đây:
Thứ nhất: Lớp trừu tượng sẽ chứa những phương thức trừu tượng.
Thứ hai : Những lớp khác khi kế thừa lớp trừu tượng sẽ cần phải định nghĩa những phương thức trừu tượng ấy.
Thứ ba : Mỗi class chỉ có thể kế thừa một lớp trừu tượng duy nhất.
Vậy mục đích chính của lớp trừu tượng là gì ?
Chính là trong lập trình, khi bạn (hay một ai đó) xây dựng hệ thống website, và trong quá trình code hệ thống ấy, bạn muốn ép buộc lập trình viên phải tuân thủ theo một số phương thức và những phương thức này đã được định nghĩa sẵn những điều căn bản, để có thể giúp cho lập trình viên có thể kế thừa những phương thức này và phát triển lớp con của nó.
2) Giao diện (interface) trong PHP
Giao diện cũng mang những nguyên tắc của lớp trừu tượng (abstract), tuy nhiên điều khác biệt nhất đó chính là 1 lớp con có thể được phép dùng nhiều lớp giao diện (ngược lại với abstract, mỗi lớp con chỉ dùng đặc tính 1 lớp cha). Nói cách khác để các bạn có thể dễ dàng hình dung đó là interface giống với những những công cụ tiện ích đã có sẵn nhưng chưa được sử dụng bao giờ, và khi ai đó muốn làm một công việc nào đó, họ sẽ sử dụng những công cụ này, hiện thực hóa nó vì mục đích của họ. Ví như bạn muốn xây một cái chuồng gà thì bạn cần những công cụ như là búa, dao, cưa,…Ví dụ sau sẽ demo cho các bạn:
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php //Giao diện búa có khả năng đóng đinh interface bua{ function dongdinh(); } //Giao diện cưa có khả năng cưa gỗ interface cua{ function cuago() } class ChuongGa implements bua,cua{ function __construct(argument){ echo "Xây chuồng gà"; } //dùng cái búa đóng đinh function dongdinh(){ echo "Đóng đinh chuồng gà"; } function cuago(){ echo "Cưa gỗ để xây chuồng"; } } ?> |
Ở ví dụ trên , ta có thể thấy rõ được sự khác biệt giữa hai lớp abtract và interface đó là:
– Interface đem lại sự lựa chọn nhiều hơn.
– Bạn có thể định nghĩa phương thức trong lớp trừa tượng (như ví dụ 1 lớp phương thức eat có thể được định nghĩa) còn lớp interface thì không được phép làm điều đó
Ngoài ra, một lớp có thể kế thừa một lớp trừu tượng và dùng nhiều lớp giao diện như ví dụ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php interface water{ public function makeItWet(); } class weather{ public function start(){ return 'Here is some weather'; } } class rain extends weather implements water{ public function makeItWet(){ return 'It is wet'; } } $a = new rain(); echo $a->start(); echo $a->makeItWet() ?> |
Hi vọng bài viết này sẽ giúp cho các bạn! 🙂
Leave a Reply