- class - lớp trong PHP
- Tạo đối tượng
- Thành viên lớp PHP
- Phương thức trong lớp
- Property trong lớp
- Hằng số const
- Truy cập thành viên lớp PHP
Class - lớp trong PHP
Lớp (class) trong PHP có thể coi nó là một kiểu dữ liệu, kiểu dữ liệu này do lập trình viên định nghĩa ra, lớp (class) nó là bản mô tả về đối tượng sẽ được tạo ra từ lớp, đối tượng đó có dữ liệu gì (thuộc tính), cách ứng xử ra sao (các phương thức trong lớp).
Để khai báo tạo ra một lớp bạn sử dụng từ khóa class
tiếp theo là tên class, toàn bộ nội dung class
định nghĩa trong cặp {}
, ví dụ khai báo lớp Product biểu diễn
một sản phẩm.
class Product { // Khai báo các thuộc tính property của lớp // (dữ liệu data, trường dữ liệu field) public $name = 'Product Name'; // Khai báo các phương thức (hàm) trong lớp public function showTitle() { echo 'Name:' + $this->name; } }
Khởi tạo đối tượng lớp (object)
Sau khi có được định nghĩa lớp như vậy, thì có thể sử dụng lớp đó tạo ra các đối tượng cụ thể - các object,
giống như việc tạo ra một biến thuộc kiểu dữ liệu, để tạo ra đối tượng mới dùng toán tử
new, ví dụ $obj = new Product();
và để xem nội dung dữ đối tượng
có thể dùng var_dump
// Tạo đối tượng mới từ lớp Product và lưu vào biến $product $product = new Product(); var_dump($product); /* object(Product)[500] public 'name' => string 'Product Name' (length=12) */
Các thành viên lớp: phương thức, hằng số, thuộc tính
Bên trong class - lớp có thể khai báo có các thành phần để lưu dữ liệu (biến), có các hằng số hai loại này được gọi là thuộc tính của lớp (property) đối khi còn gọi là trường dữ liệu (field). Lớp cũng khai báo để chứa các hàm - chúng gọi là các phương thức (method). Thuộc tính, phương thức gọi chung là thành viên của lớp.
Khai báo phương thức trong lớp
Các phương thức được định nghĩa, khai báo bên trong lóp giống như cách khai bảo một hàm bên ngoài thông thường,
nó có thể trả về giá trị, nó có thể có tham số, tham số mặc định ...
Ví dụ sau định nghĩa hàm getPrice()
trong lớp.
class Product { public $name = 'Product Name'; private $price = 0; // Trả về dữ liệu $price của sản phẩm public function getPrice() { return $this->price; } }
Hàm trong lớp (phương thức) khi định nghĩa thì nó thường bắt đầu bằng các từ khóa
xác định phạm vi truy cập (visibility
bạn sẽ tìm hiểu kỹ hơn ở phần kế thừa)
đó các từ khóa: public
, private
hoặc protected
nếu khi định nghĩa hàm không chỉ ra một trong các từ khóa này thì phương thức đó được hiểu là public
.
Một thành viên lớp (method và thuộc tính), xác định phạm vi truy cập như sau:
public
thành viên này (method, property) có thể truy cập ở bất kỳ đâu.private
chỉ có thể truy cập từ chính lớp định nghĩa ra thành viên.protected
chỉ có thể truy cập từ chính lớp định nghĩa ra thành viên và các lớp kế thừa nó.
Khai báo property - thuộc tính, thành viên chứa dữ liệu
Định nghĩa các thuộc tính (biến) của lớp giống với định nghĩa biến thông thường nhưng có kèm theo tiền tố là các từ khóa xác định phạm vi truy cập. Như ví dụ trên lớp Product có hai thuộc tính $name và $price
public $name = 'Product Name'; private $price = 0; // thuộc tính này chỉ truy cập được bên trong lớp (thông qua $this)
Khai báo hằng số const của lớp
Khai báo hằng của lớp sử dụng từ khóa const
, ý nghĩa giống như hằng số thông thường
Hằng số PHP.
Tuy nhiên trước từ khóa const có thể thiết lập phạm vi truy cập bằng các từ khóa như
public (mặc định), private, protected. Để truy cập đến hằng số thì sử dụng ký hiệu ::
ClassName::ConstName // Hoặc $object::ConstName
Truy cập phương thức, thuộc tính của đối tượng lớp
Ký hiệu ->
Khi bạn đã có một đối tượng tạo ra từ lớp (ví dụ $obj
) thì để truy cập thành viên
của lớp sẽ dùng ký hiệu mũi tên ->
, ví dụ:
$n = $obj->name; // truy cập thuộc tính, đọc giá trị $obj->name = 'Xyz'; // truy cập thuộc tính, gán giá trị vào thuộc tính $obj->myMethod(); // Truy cập, gọi phương thức của đối tượng
Biến $this
Từ một thành viên hàm của lớp, bạn muốn truy cập tới thành viên khác (thuộc tính, phương thức)
thì trong OOP với PHP sử dụng ký hiệu biến $this
, biến này là tham chiếu đến đối tượng lớp.
Do vậy có thể sử dụng nó giống như biến $obj
ở trên, ví dụ truy cập thuộc tính $this->name
Ví dụ tổng hợp
class User { public const MGS = "Information:"; public $name = "User Name"; // property $name có khởi tạo với giá trị mặc định "User Name" private $age; private $info; public function setInfo($name, $age) { // Trong lớp, dùng $this để truy cập phương thức, thuộc tính của lớp $this->age = $age; $this->name = $name; // Truy cập được processInfomation từ bên trong class $this->processInfomation(); } // Phương thức này - thiết lập giá trị info protected function processInfomation() { $this->info = $this::MGS . $this->name.' is '.$this->age.' years old'; } public function getInfo() { // Truy cập được info từ bên trong lớp return $this->info; } }
Khi sử dụng:
$user = new User(); // Khởi tạo đới tượng mới $user->setInfo('XUANTHULAB', 20); // Gọi phương thức echo $user->name; // Truy cập thuộc tính name echo $user::MGS; // Truy cập hằng số MGS echo User::MGS; // Truy cập hằng số MGS echo $user->getInfo(); // Information:XUANTHULAB is 20 years old
Một vài trường hợp sử dụng phát sinh lỗi
// Gọi phương thức processInfomation $user->processInfomation(); /* Lỗi dừng script: Call to protected method User::processInfomation() from scope Lỗi này do processInfomation khai báo là protected nên không thể truy cập từ ngoài lớp, chỉ truy cập bên trong nội bộ lớp (phương thức setInfo gọi processInfomation thì được). */
echo $user->age; /* Script bị dừng và có thông báo: Cannot access private property User::$age Tương tự như trên, $age khai báo là private nên bên ngoài không truy cập được, nhưng nội bộ lớp (như hàm setInfo có truy cập) thì được. */
Chú ý: Nhằm giám sát lỗi, và cấu trúc chặt chẽ hơn từ PHP 7 cho phép khai báo biến, tham số hàm có thể chỉ rõ kiểu, kể cả phương thức cũng có thể khai báo kiểu trả về. Bạn nên cố gắng viết code theo cách này. Lớp User trên có thể viết
class User { public const MGS = "Information:"; public string $name = "User Name"; private int $age; private string $info; // Phương thức nhận tham số kiểu string và int trả về void public function setInfo(string $name, int $age) : void { $this->age = $age; $this->name = $name; $this->processInfomation(); } protected function processInfomation() : void { $this->info = $this::MGS . $this->name.' is '.$this->age.' years old'; } public function getInfo() : string { return $this->info; } }