OOP trong PHP
OOP hay hướng đối lượng sẽ không xa lạ với các developer. Hôm nay cùng tui điểm qua OOP trong PHP nha!
Tính trừu tượng
Nó như bao ngôn ngữ khác thôi. Mình phải tưởng tượng và hình dung được đối tượng đó cần những thuộc tính, phương thức gì để mô tả nó không lang mang dài dòng, tốn bộ nhớ.
Tính đóng gói
Tức là bảo mật được dữ liệu ở đây PHP cũng là get, set như bao ngôn ngữ khác vậy. Và lưu ý rằng thuộc tính phải là private hoặc protected nha.
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
Ví dụ hàng xóm sang mượn búa, thay vì bảo hàng xóm cứ tự nhiên vào lục lọi, ta sẽ bảo: “Ấy bác ngồi chơi để tôi bảo cháu lấy cho”.
Tính đóng gói: Có thể gói dữ liệu (data, ~ biến, trạng thái) và mã chương trình (code, ~ phương thức) thành một cục gọi là lớp (class) để dễ quản lí. Trong cục này thường data rất rối rắm, không tiện cho người không có trách nhiệm truy cập trực tiếp, nên thường ta sẽ che dấu data đi, chỉ để lòi phương thức ra ngoài.
Tính kế thừa
Như ngoài thực tế, người cha nhượng quyền sở hữu cho con cái gì thì con được hưởng cái đó. trong PHP thì như thế này.
<?php
class Email
{
protected $nguoiGui = 6;
private $nguoiNhan;
const ESC = 1;
const DESC = 2;
public function sendEmail()
{
echo "gui email";
}
}
class htmlEmail extends Email
{
public function __call($method, $arguments)
{
echo "khong co method nay";
}
public function __get($property)
{
return $this->nguoiGui[$property];
}
}
?>
Sẵn code ở trên mình giới thiệu các bạn hàm __call hàm này là khi gọi method không tồn tại thì hàm này sẽ được thực hiện ớ.
Tính đa hình
Đa hình mô tả một mô hình của lập trình hướng đối tượng, mà ở đây các class có chức năng khác nhau nhưng chia sẻ cùng 1 interface.
Một nguyên tắc quan trọng trong OOP là một class chỉ nên thực hiện một việc, và nó nên làm điều đó thật tốt.
Ví dụ, cùng là một người nhưng tuỳ từng ngữ cảnh sẽ đóng vai trò khác nhau, một người đàn ông vừa là nhân viên (khi đi làm), vừa là một người chồng (đối với vợ) và là người cha (đối với con),… nói chung là anh ta sẽ biến hình thành con người khác nhau tuỳ từng ngữ cảnh.
Trong OOP và cụ thể là trọng ngôn ngữ C++ thì Polymorphism có 2 dạng:
- Dạng 1 – Compile time Polymorphism: Một class có nhiều hàm cùng tên nhưng khác nhau về số lượng tham số hoặc kiểu dữ liệu của tham số. Khi call hàm cùng tên đó thì trong quá trình biên dịch, compiler sẽ quyết định hàm nào (trong số các hàm cùng tên) sẽ được call dựa trên số lượng tham số và kiểu dữ liệu của tham số truyển vào hàm. Việc định nghĩa các hàm cùng tên được gọi là overloading – nạp chồng hàm.
- Dạng 2 – Runtime Polymorphism: Cùng một class có thể cho ra nhiều biến thể, không phải được định nghĩa bởi lớp đó, mà bởi các lớp con của nó. Đây là một phương pháp để định nghĩa lại hành vi của lớp cơ sở mà không phải sửa code của lớp cơ sở. Nếu call hàm của đối tượng của lớp dẫn xuất thông qua con trỏ của lớp cơ sở thì việc hàm nào được call sẽ được quyết định lúc Runtime. Runtime Polymorphism được thực hiện bằng phương pháp overriding – ghi đè phương thức.
Đọc thêm tại đây rất rõ ràng đấy.
Một vài điểm trong OOP PHP
Contractor hay hàm tạo tức là khi bạn tạo một đối tượng thì hàm này sẽ tự động được gọi.
class Email
{
function __construct()
{
}
}
Tương tự ta có hàm hủy sẽ tự động gọi khi giải phóng đối tượng
class Email
{
function __destruct()
{
}
}
Ngoài ra PHP còn hỗ trợ một số hàm kiểm tra class như: class_exists(), method_exists(), property_exists().
is_a($e, “Email”); kiểm tra $e có thuộc loại đối tượng class Email không.
get_declared_classes(); liệt kê toàn bộ class có thể sử dụng được.