Lập trình hướng đối tượng với PHP và những điều phải biết (phần 1)
1. Các đặc điểm cơ bản của lập trình hướng đối tượng. Chúng được thể hiện như thế nào trong PHP
Lập trình hướng đối tượng với 4 đặc điểm cơ bản sau.Tính đóng gói
- Tính đóng gói (encapsulation) “đóng gói” thuộc tính và phương thức của mục tiêu (hoặc lớp) thông qua việc dừng quyền truy cập (hoặc thay đổi) giá trị của thuộc tính hoặc quyền gọi phương thức. Nói bí quyết khác tính đóng gói cho phép kiểm soát quyền truy cập (và thay đổi) giá trị của thuộc tính hoặc quyền gọi phương thức của mục tiêu (hoặc lớp) và mục tiêu (hoặc lớp) con.
- Trong PHP việc đóng gói được vận hành nhờ sử dụng các từ khoá
public
,private
vàprotected
:public
: Cho phép truy cập (và thay đổi giá trị) của thuộc tính và phương thức ở đại khái phạm vi, có thể hiểu là với đặc tính cộng đồng.protected
: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của mục tiêu con (hoặc lớp con), có thể hiểu là với đặc tính chiếc họ.private
: Chỉ cho phép truy cập (hay thay đổi) giá trị của thuộc tính và phương thức ở phạm vi của đối tượng (hoặc lớp), sở hữu thể hiểu là mang đặc tính gia đình.
Tính kế thừa
- Tính kế thừa trong lập trình hướng đối tượng cho phép một lớp (class) sở hữu thể kế thừa những thuộc tính và phương thức từ các lớp khác đã được định nghĩa. Lớp được kế thừa còn được gọi là lớp cha và lớp kế thừa được gọi là lớp con.
- Điều này cho phép những đối tượng sở hữu thể tái tiêu dùng hay tăng diện tích các đặc tính sẵn sở hữu mà không hề tiến hành định nghĩa lại.
- Trong PHP, một lớp với thể kế thừa từ một lớp khác, việc kế thừa được đang chạy thông qua dùng từ khóa
extends
. Đối tượng thuộc lớp con sẽ mang những thuộc tính và phương thứcprotected
vàpublic
của lớp mà nó kế thừa.
Tính trừu tượng.
- Tính trừu tượng (abstraction) trong lập trình hướng mục tiêu giúp giảm sự phức tạp thông qua việc dồn vào vào những đặc điểm trọng yếu hơn là đi sâu vào chi tiết.
- Như vậy khi tương tác với đối tượng chỉ bắt buộc nhấn mạnh tới những thuộc tính, phương thức buộc phải thiết. Chi tiết về nội dung không phải sử dụng rộng rãi đến.
- PHP có
abstract class
vàinterface
để trừu tượng hóa những đối tượng. Ví dụ khi ta tạo một lớp (class) sử dụng đại diên cho các tài khoản tiền gửi ngân hàng của những người dùng và đặt tên cho lớp này làBankAccount
. Lớp này có hai thuộc tính là$balance
và$interest
dùng để lưu dữ liệu số tiền dư và lãi suất tiền gửi của tài khoản.
deposit
và withdraw
. Các lập trình viên không yêu cầu phải chú ý tới sự phức tạp (hay nội dung chi tiết) của việc xử lý những việc làm gửi tiền và rút tiền trên mà chỉ yêu cầu biết mục đích của từng phương thức là gì.Với tính trừu tượng thì lập trình viên chỉ bắt buộc quan tâm tới mục đích của phương thức
deposit
là để nạp tiền vào tài khoản. Toàn bộ yếu tố của giai đoạn xử lý gửi tiền sẽ được thực hiện ở bên trong phương thức deposit
.Tính đa hình
- Thể hiện qua việc sở hữu thể định nghĩa một đặc tính, hoặc phương thức cho một loạt những đối tượng gần giống nhau. Nhưng lúc đang chạy thì các mục tiêu khác nhau sẽ với biện pháp đang chạy khác nhau và cho ra kết quả khác nhau.
- Tính đa hình (polymorphism) trong lập trình hướng mục tiêu cho phép những lớp con mang thể viết lại (override) những thuộc tính hoặc phương thức từ lớp cha. Ví dụ: Đối tượng “hình vuông” và “hình tròn” mang chung 1 phương thức là “chu_vi”. Khi gọi phương thức này thì với mỗi mục tiêu sẽ mang một công thức tính khác nhau và cho ra kết quả khác nhau. Trong PHP:
- Các lớp con sở hữu thể viết lại hoặc tăng thêm phương thức của lớp cha mà nó kế thừa.
- Các class cùng implement một interface nhưng chúng sở hữu bí quyết thức thực hiện khác nhau cho các method của interface đó.
- Qua đó cùng một phương thức sẽ cho kết quả khác nhau khi được gọi bởi các đối tượng thuộc lớp khác nhau.
2. Sự không giống nhau giữa Abstract Class
và Interface
Interface
và Abstract class
là 2 khái niệm cơ bản trong lập trình OOP. Nhưng phân to lớn hầu hết người cảm thấy mơ hồ và lẫn lộn 2 khái niệm này. Vậy chúng là gì, khác nhau như nào? Tại sao sử dụng chiếc này Interface
mà ko phải Abstract
và ngược lại ??? Bỏ qua toàn bộ những phần về lý thuyết của việc tạo một abstract class
và interface
. Bạn ko phải tập trung nhiều lựa chọn tới việc abstract
có thể khai báo những gì, hay interface
có được phép định nghĩa nội dung phương thức hay không. Điểm cơ bản khi bạn được hỏi về sự không giống nhau giữa chúng là gì? Đó chính là mục đích mà chúng được sử dụng: – Abstract class
: là một class cha cho toàn thể những class mang cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class. Hai class cùng hiện thực một interface
có thể đông đảo khác nhau về bản chất. Hiểu đơn thuần như một thằng con (child class) chỉ mang thể là con của một thằng cha, với tính giải pháp giống cha (abstract class) nó. – Interface
: là một chức năng mà bạn sở hữu thể thêm và bất kì class nào. Từ chức năng ở đây không đồng nghĩa với phương thức (hoặc hàm). Interface
có thể bao gồm phổ biến hàm/phương thức và rất nhiều chúng cùng phục vụ cho một chức năng. Vậy, bạn không đề nghị nhầm lẫn lúc nói về việc một class được implement
hay extend
. Nhiều người thường hay đồng nhất là không minh bạch hai từ này, nhưng chính chúng đã nói lên sự khác biệt giữa interface
và abstract class
. Bạn chỉ sở hữu thể thừa kế (extend
) từ một class và chỉ với thể hiện thực (implement
) những chức năng (interface
) cho class của mình.Cuối cùng, cũng buộc phải liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể dùng được lúc buộc phải thiết. Các điểm khác biệt này mang thể khác nhau tùy vào tiếng nói mà bạn sử dụng. Vì vậy bạn chỉ bắt buộc nhớ những điểm căn bản sau:
Interface | Abstract class | |
---|---|---|
Multiple inheritance | Một class với thể hiện thực đa dạng interface.(tạm coi là thừa kế) | Không tư vấn đa thừa kế |
Access Modifiers | Mọi phương thức, property đều mặc định là public. | Có thể thừa nhận modifier. |
Adding functionality | Mọi phương thức, property của interface đề nghị được hiện thực trong class. | Không đề nghị thiết. |
Fields and Constants | Không | Có |
Nếu một classimplements
nhiềuinterface
mà cácinterface
có những phương thức cùng tên thì sẽ ko lỗi giả dụ các phương thức đó truyền vào số lượng biến bằng nhau. Còn nếu các phương thức đó khác số lượng biến truyền vào thì sẽ sinh ra lỗi “Fatal error”.
3. Thế nào là một phương thức static
. Phân biệt giải pháp sử dụng từ khoá static::method()
với self::method()
Phương thức static
.
- Phương thức
static
là phương thức sở hữu thể truy cập mà không cần khởi tạo một đối tượng của class. - Phương thức
static
gắn ngay lập tức vớiclass
hơn là vớiobject
(là thành phần khởi tạoclass
bằng từ khóanew
), đây là những phương thức chỉ mang một, với liên hệ chấp nhận và ko thay đổi liên hệ trên vùng nhớ (tĩnh). - Khi chương trình chạy, nó sẽ được sinh ra lần đầu nhất|thứ 1|thứ nhất|trước tiên} trước đông đảo những truy nhập tới nó và tồn tại cho tới lúc chương trình kết thúc.
Việc thực thi hàmstatic
trongclass
có thể triển khai bằng lệnh:static::staticMethod()
,self::staticMethod()
hoặc$this->staticMethod()
, trong đóself
vàstatic
là đại diện củaclass
, còn$this
là đại diện củaobject
. Trong phương thứcstatic
không thể gọi phương thức hoặc thuộc tínhnon-static
. Nhưng phương thứcnon-static
có thể gọi phương thức hoặc thuộc tínhstatic
. Bởi vì mang thể hiểu đơn giản như sau:
- Phương thức
static
có thể gọi ngay cả lúc chưa khởi tạoobject
, Vậy nên giả dụ phương thứcstatic
gọi đến một phương thứcnon-static
thì khi chưa khởi tạoobject
, sẽ không sở hữu biến$this
(là đại diện củaobject
) để gọi tới phương thức ‘non-static`.- Đương nhiên phương thức
non-static
luôn luôn sở hữu thể gọi đến phương thứcstatic
vì phương thứcstatic
đã tồn tại ngay từ lúc chạy chương trình, khiobject
chưa được khởi tạo.
Phân biệt cách tiêu dùng từ khoá static::method()
với self::method()
.
Như ở trên chúng ta có nhắc đến từ khóa static::method()
với self::method()
, chúng đều là đại diện cho class
để gọi đến các phương thức và thuộc tính static
. Câu hỏi đặt ra là Thế tại sao lại yêu cầu với tới 2 từ khóa?
. Nếu chỉ đơn thuần như trong nội bộ class
thì cả 2 từ khóa trên đều cho ra kết quả giống nhau. Nhưng chúng với thể sẽ khác nhau giả dụ khi class
này extends
từ class
khác.Nói tóm lại:
self
: đại diện cho classkhai báo
nó.static
: đại diện cho classgọi
đến nó.
Techtalk via Viblo
Nguồn: techtalk.vn
Post a Comment