10/10/2018, 10:31

[PHP] Interface trong OOP

Cho em hỏi nó là gì và tại sao phải dùng nó, và một ví dụ. Em mò mãi ko hiểu, thanks
Theo như em biết là interface dùng để chỉ định phương thức nào một class phải có, nhưng em ko hiểu làm thế để chi nhỉ
Scripted viết 12:38 ngày 10/10/2018
OOP la` Object Oriented Programming

Sử dụng Interface để điểu khiển dể hơn.

Ví dụ:

IChatService -> là interface của những chat service này!

MSNChatService
YAHOOChatService
AOLChatService

tất cả nhuũng chatservice này họ sẽ dùng cùng một command đó là Send Message and Recieve Message

Tuy rằng code có thể khác nhau ... nhưng nếu send message thi` ho. sẽ share cùng function name.
IChatService.send(username, message)

Khi chúng ta có cái interface ... chúng ta bắt buột những class chat fải có function và như vậy chúgn ta có thể điều khiển code một cách hiệu quả hơn!

Hy vọng giúp được bạn phần nào!
Hok bik zì viết 12:45 ngày 10/10/2018
Interface trong lập trình hướng đối tượng được sử dụng để thực hiện "đa kế thừa" khi mà bản thân ngôn ngữ đã bỏ tính chất đa kế thừa của class.
Các class khi sử dụng interface phải implement các method trong interface nếu không nó sẽ trở thành abstract class và không thể tạo object.
pcdinh viết 12:31 ngày 10/10/2018
Đánh cho cái bây giờ. Đa kế thừa nào ở đây?

Mục đích của kế thừa là reuse lại code. Interface đâu có cho reuse lại code. Chính vì thế nó mới đi với từ
Code:
implements
. Các bác bên C++ và Python cứ lạm bàn thành và cố ép nó vào các kiểu của các bác ý.

Mục đích của interface là để tạo ra các ràng buộc về giao diện. Điều này là code lõi của của cái gọi là Design By Contract.

Người ta dùng nó làm gì và trong bối cảnh nào:

+ Bối cảnh thực tế: Có 3 ông khách vào một tòa nhà được bảo vệ nghiệm ngặt. Tòa nhà đó có 2 lớp kiểm tra:
- Kiểm tra hộ chiếu hay CMT
- Kiểm tra lịch hẹn

Vậy thì khi 3 ông khách vào, 3 ông sẽ phải thực hiện bắt buộc 2 thủ tục nó trên. Nghĩa là 3 ông dù có khác nhau thế nào, cao hay thấp đều phải có 2 khả năng này.

+ Mô tả tình huống trên bằng code thì sẽ có 3 class khác nhau nhưng chúng đều có 2 phương thức sau đây

-- getPassport()
-- getName()
Bây giờ chúng ta gói 2 phương thức nói trên vào một tên gọi chung là interface GuestRequirement

Code:
interface GuestRequirement 
{
    public function getPassport();
    public function getName();   
}
Interface này quy định về mặt hình thức các ràng buộc mà 3 lớp trên cần đáp ứng vì các ràng buộc đó sẽ được kiểm tra bởi lớp sẽ sử dụng nó.

Giả sử như lớp sử dụng (lớp của tòa nhà) có tên là SecurityStaff, nó sẽ sử dụng các lớp ràng buộc bởi interface như sau:

Code:
class SecurityStaff
{
    public function check(GuestRequirement $guest)
    {  
        if (empty($guest->getPassport()))
        {
            throw new Exception('Passport phải mang theo');
        }

        if (false === $this->hasAppointment($guest->getName()))
        {
            throw new Exception('No appointment ');
        }        
    }
}
Vậy lớp SecurityStaff không cần biết $guest là mẫu của class nào miễn là nó thỏa mãn các ràng buộc của GuestRequirement. 3 ông hay 5 ông, hay 10 ông nó mặc kệ.

Các bạn sẽ phải phân biệt cái gọi là

+ Reuse code: kế thừa lớp mẹ để không phải duplicate lại code.
+ Constrained by interface mà mục tiêu của nó là đảm bảo việc truyền message bên trong lớp sử dụng. Code bị duplicate là bình thường
ambvn viết 12:33 ngày 10/10/2018
Cám ơn bác pcdinh
dd không có nút thanks nhỉ?
TheHeTre viết 12:34 ngày 10/10/2018
Có đấy, bạn vừa gõ và submit rồi.

Bác @pcdinh diễn tả rất dễ hiểu. Ngoài ra các bạn có thể tham khảo ở đây: http://www.talkphp.com/vbarticles.ph...actory-pattern
jiSh@n viết 12:41 ngày 10/10/2018
Hà hà, bác pcdinh mà đi dạy thì sau này các cty đỡ tốn chi phí đào tạo lại phải biết
son8xvn viết 12:37 ngày 10/10/2018
Em mới học OOP. kiến thức còn nông cạn, cho em hỏi này :

Code:
class SecurityStaff
{
    public function check(GuestRequirement $guest)
    {  
        if (empty($guest->getPassport()))
        {
            throw new Exception('Passport phải mang theo');
        }

        if (false === $this->hasAppointment($guest->getName()))
        {
            throw new Exception('No appointment ');
        }        
    }
}
Em thắc mắc ở chỗ:
Code:
public function check(GuestRequirement $guest)
sao lại có GuestRequirement trong fuction check ???
jiSh@n viết 12:38 ngày 10/10/2018
Được gửi bởi son8xvn
Em mới học OOP. kiến thức còn nông cạn, cho em hỏi này :

Code:
class SecurityStaff
{
    public function check(GuestRequirement $guest)
    {  
        if (empty($guest->getPassport()))
        {
            throw new Exception('Passport phải mang theo');
        }

        if (false === $this->hasAppointment($guest->getName()))
        {
            throw new Exception('No appointment ');
        }        
    }
}
Em thắc mắc ở chỗ:
Code:
public function check(GuestRequirement $guest)
sao lại có GuestRequirement trong fuction check ???
Type Hinting: http://php.net/manual/en/language.oop5.typehinting.php
son8xvn viết 12:39 ngày 10/10/2018
em đọc, sao thấy khó hiểu quá.
bác nào giải thích giúp em đc ko ạ ?
Bài liên quan
0