2011-01-13 29 views
5

Tôi đang cố gắng cải thiện kiến ​​thức về OOP trong PHP và đã nghiên cứu các lớp và giao diện trừu tượng.Ví dụ thế giới thực của các tính năng OOP nâng cao cho PHP

Những gì tôi đã học được

  • Họ là cả hai lớp mà không thể được khởi tạo tự nhưng olny có thể được mở rộng (thực hiện trong trường hợp các giao diện)
  • Các lớp trừu tượng cung cấp phương pháp và tài sản cho các lớp học khác mở rộng chúng.
  • Nếu một lớp sử dụng một phương thức trừu tượng thì bản thân lớp đó cũng phải là trừu tượng.
  • Nếu một phương thức trừu tượng được định nghĩa trong một lớp trừu tượng, tất cả các lớp con phải xác định các chi tiết của phương thức đó. Các phương thức không được định nghĩa là abstract có thể được sử dụng giống như các phương thức thông thường.
  • Giao diện xác định những phương thức mà một lớp thực hiện nó phải có. Chức năng của các phương thức không được định nghĩa trong giao diện, giao diện chỉ cung cấp một danh sách các phương thức phải được đưa vào lớp con.
  • Giao diện không xác định bất kỳ thuộc tính nào.
  • Lớp học có thể thực hiện nhiều giao diện như họ muốn nhưng họ phải xác định một phương pháp cho mỗi một trong những giao diện mà họ thực hiện

Tôi nghĩ rằng bao gồm những điều cơ bản. Xin vui lòng thêm vào đó nếu bạn nghĩ rằng có bất cứ điều gì tôi đã bỏ qua.

Điều tôi muốn biết là nếu có bất kỳ ví dụ thực tế nào về việc triển khai các lớp này, đặc biệt là lớp giao diện. Có ai biết về bất kỳ ứng dụng nguồn mở nào sử dụng chúng mà tôi có thể duyệt để hiểu rõ hơn về chúng và xem vị trí và thời điểm chúng được sử dụng hiệu quả không? Tôi đã xem qua các ví dụ về sách sử dụng động vật không thể hiện được tầm quan trọng của các lớp này.

Trả lời

1

Không phải là ví dụ thế giới thực như vậy, nhưng một Mẫu thiết kế mà bạn thường gặp phải các giao diện và lớp trừu tượng là Command Pattern. Xem liên kết cho mã ví dụ.

Nói chung, "lập trình chống lại một giao diện" được coi là thực hành OO tốt, bởi vì nó tách riêng việc triển khai cụ thể và cho phép bạn dễ dàng thay đổi chúng hơn cho các triển khai khác, ví dụ:thay vì yêu cầu cho một lớp học cụ thể

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

bạn chỉ cần hỏi mà nó cung cấp một tập hợp các phương pháp

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

giao diện cũng giúp trêu chọc cấu trúc thừa kế ngoài lớn. Vì PHP chỉ hỗ trợ Thừa kế đơn, bạn sẽ thường thấy các cấu trúc phân cấp như sau:

BaseClass -> Logger -> Auth -> User 

trong đó mỗi khía cạnh cụ thể được sử dụng trong các lớp này. Với giao diện, bạn chỉ cần thực hiện

User implements Loggable, Authenticable 

và sau đó bao gồm mã cụ thể đó qua mẫu chiến lược hoặc thành phần/tập hợp, cuối cùng được duy trì nhiều hơn.

Đối với một danh sách các giao diện được xác định trước trong PHP xem câu trả lời của tôi để:

2

PHP đi kèm với vài giao diện predefinded theo mặc định: http://www.php.net/manual/en/reserved.interfaces.php

PHP cũng chứa Chuẩn PHP Thư viện (SPL), trong đó xác định hơn:

Zend Framework cũng là ví dụ rất hay khi các khái niệm đó là đã sử dụng. http://framework.zend.com/

+0

Ngoài ra, ZF2 đang tiến hành wiki: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@Gordon: hãy tìm ví dụ tại địa chỉ đó: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@Gordon, chỉnh sửa câu trả lời – vartec

0

Có thể nói rằng giao diện hoàn toàn là 100% lớp trừu tượng nhưng trừu tượng thì không. Bởi vì nhiều thời gian chúng ta định nghĩa hàm trong lớp trừu tượng. Nhưng trong lớp giao diện chúng ta luôn khai báo hàm.

1

Từ khóa thức ngăn chặn các lớp được mở rộng bởi các lớp khác, ví dụ:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

Lớp Pet sẽ ném ra một lỗi trong đó nêu: Fatal error: Class Pet may not inherit from final class (Brother)

này cũng có sẵn cho các phương pháp, vì vậy nếu bạn làm không muốn cho phép các phương thức được kế thừa khiến lớp con có cùng phương thức hoạt động như một ghi đè.

http://php.net/manual/en/language.oop5.final.php

Yo sử dụng mà bạn muốn một số ví dụ thế giới thực của những gì các giao diện có thể được sử dụng cho, cũng một database abstraction layer

Bạn có 1 lớp cơ sở cung cấp các phương pháp cơ bản để lặp cơ sở dữ liệu của bạn dữ liệu, nhưng điều đó sẽ sử dụng một lớp con cho kiểu cơ sở dữ liệu, chẳng hạn như MySql, MsSql, mỗi loại cơ sở dữ liệu sẽ có lớp riêng của nó, nhưng đối với lớp cơ sở để đảm bảo rằng nó có các phương thức này, giao diện.

Ví dụ

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

Vì vậy, các lớp cơ sở biết rằng MySql và MSSQL có các phương pháp trên, do đó làm giảm sai sót và trở thành có tổ chức hơn.

Khi chuyển đối tượng vào lớp bạn muốn chắc chắn rằng đối tượng thuộc một loại nhất định, PHP5 cho phép bạn xác định loại đối tượng nào sẽ được chuyển vào phương thức làm tham số.

cho phép nói rằng bạn có 3 lớp

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

bạn đặc biệt có thể xác định trong constructuin của DatabaseConnection mà bạn yêu cầu một lớp DatabaseCredentials như vậy:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

Cách tốt nhất để thực sự bắt đầu là bằng cách đọc ở đây:


Một tính năng của PHP5 bạn có thể muốn xem xét là không gian tên, điều này sẽ cho phép bạn giữ mã của mình được sắp xếp, có nhiều đối tượng có cùng tên, giúp tải tự động hiệu quả hơn

Ví dụ nhỏ:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

Và bạn chỉ có thể sử dụng như:

use Database; 
$Database = new MySql\Database(); 
+0

Tôi đã đọc rằng không gian tên char là \. Tôi là loại bị mất, là nó/hoặc \? – Aif

+0

Không, bạn chỉ cần mã giả – RobertPitt

1

Bạn có thể làm theo các "PHP patterns" series bởi Giorgio Sironi trong DZone hoặc trực tiếp trong his blog, thực sự thú vị nếu bạn là mẫu quan tâm và OOP.

Ngoài ra, bạn có thể xem qua số Best PHP programming book trong ngăn xếp nếu bạn cần một cuốn sách PHP tốt.

Các vấn đề liên quan