Abstract Class (lớp trừu tượng) trong PHP
- 17-03-2023
- Toanngo92
- 0 Comments
Mục lục
Khái niệm Abstract Class (lớp trừu tượng)
Trong khi thực hiện kế thừa, có thể thấy rằng người ta có thể tạo đối tượng của lớp cha cũng như lớp con. Tuy nhiên, nếu người dùng muốn hạn chế sử dụng trực tiếp lớp cha thì sao? Nghĩa là, trong một số trường hợp, người ta có thể muốn định nghĩa một lớp cơ sở khai báo cấu trúc của một thực thể nhất định mà không đưa ra cách triển khai đầy đủ mọi phương thức. Một lớp cơ sở như vậy đóng vai trò là một dạng tổng quát sẽ được kế thừa bởi tất cả các lớp con của nó. Các phương thức của lớp cơ sở phục vụ như một hợp đồng hoặc một tiêu chuẩn mà lớp con có thể triển khai theo cách riêng của nó.
Một lớp trừu tượng phục vụ như một khuôn khổ cung cấp một số hành vi nhất định cho các lớp khác. Lớp con cung cấp hành vi theo yêu cầu cụ thể của khung hiện có. Các lớp trừu tượng không thể được khởi tạo và chúng phải được phân lớp để sử dụng các thành viên của lớp. Lớp con cung cấp các triển khai cho các phương thức trừu tượng trong lớp cha của nó.
PHP cung cấp từ khóa abstract để sử dụng tác vụ này.
Sau đây là một số điểm quan trọng cần lưu ý về các abstract class và abstract method:
- Các abstract class có thể có các method (phương thức) và properties (thuộc tính) tương tự như các class khác. Tuy nhiên, chúng không thể được khởi tạo.
- Một class con phải được tạo để khởi tạo một abstract class.
- Class (lớp) phải là abstract (trừu tượng) để có một method (phương thức) trừu tượng.
- (Abstract method) Phương thức trừu tượng là một khai báo có phần thân rỗng. Tên của phương thức và đối số được cung cấp bởi người dùng.
Ví dụ:
<?php
abstract class Microwave{
abstract public function bake();
}
Trong ví dụ này, lớp Microwave là abstract class với bake() là một abstract method.
Mục đích chính của abstract class là để cho các nhà phát triển tuân theo các nguyên tắc nhất định. Ví dụ: để tạo một lớp mới kế thừa lớp Microwave , cần cung cấp định nghĩa cho abstract method bake().
Do đó, lớp con bắt buộc phải định nghĩa phương thức bake().
Non-Abstract Method trong Abstract Class (Phương thức không trừu tượng trong Abstract Class)
Một phương thức trừu tượng có thể có cả phương thức trừu tượng và không trừu tượng. Một lớp có phương thức trừu tượng phải được khai báo trừu tượng, lớp con có thể truy cập mà không cần ghi đè.
Ví dụ sau đây cho thấy cách bao gồm phương thức không trừu tượng trong Microwave được xác định trước đó:
<?php
abstract class Microwave{
protected $degree;
public function start(){
echo $this->degree."- Microwave start ... <br/>";
}
public function stop(){
echo $this->degree. "- Microwave stop ... <br/>";
}
public function setDegree($degree){
$this->degree = $degree;
}
abstract public function bake();
}
Trong ví dụ này, ba phương thức không trừu tượng là start(), stop() và setDegree() được thêm vào abstract class Microwave:
Kế thừa abstract class (inheriting abstract class/extend abstract class)
Tương tự như các lớp khác, các lớp trừu tượng cũng có thể được kế thừa. Lớp con khộng nếu định nghĩa là abstract class, nó phải định nghĩa abstract method . Ngược lại, lớp con nếu được định nghĩa là abstract class nó không định nghĩa abstract method.
Ví dụ:
abstract class Microwave{
protected $degree;
public function start(){
echo $this->degree."- Microwave start ... <br/>";
}
public function stop(){
echo $this->degree. "- Microwave stop ... <br/>";
}
public function setDegree($degree){
$this->degree = $degree;
}
abstract public function bake();
}
abstract class Oven extends Microwave{
abstract function bake();
}
class Onida extends Microwave{
public function bake(){
echo $this->degree."- Onida bake ... <br/>";
}
}
class Samsung extends Microwave{
public function bake(){
echo $this->degree."- Samsung bake ... <br/>";
}
}
$samsung = new Samsung();
$samsung->setDegree("1000");
$samsung->bake();
Khác biệt giữa một interface và một abstract class
- Trong khi một interface không thể có các method cụ thể và chỉ có các method trừu tượng, một abstract class có thể có cả hai.
- Trong một interface, người dùng chỉ có thể khai báo các method là public. Tuy nhiên, trong một abstract class, người dùng có thể khai báo các phương thức là public, private hoặc protected.
- Trong một class có thể triển khai nhiều interface nhưng chỉ có một lớp abstract class có thể được kế thừa.
Bài tập
Task: Make PHP pages to allow Account Registration, Login, Reset PIN, Change PIN for a Library Kiosk system.
Part 1: Make the database connection (4 points)
Write a PHP file (e.g. db.php) that can be added to other PHP files using include or require. This file should:
-
Connect to MySQL and store the connection resource in a variable (mysqli/PDO). (1 point)
-
Create a database
library_kioskif it does not exist. (1 point) -
Select the database and create table
kiosk_accountsif it does not exist with fields: (1 point)-
USERNAMEVARCHAR(100) -
PIN_HASHCHAR(40) -
STUDENT_IDVARCHAR(12)
-
-
USERNAMEmust be UNIQUE -
If any operation causes an error, stop execution and print the error. (1 point)
PIN_HASHstores SHA-1 hex string (CHAR(40)). Escape user input properly.
Part 2: Write the registration form (4 points)
All of this part must be done in one PHP file (e.g. register.php).
-
Output a form containing 3 fields:
username,pin,student_id. Submit via POST to the same file. (1 point) -
Before insert: query the database; if username exists already, display an error and show a blank form again. (1 point)
-
If username not exists:
-
Hash the PIN (SHA-1)
-
Insert into DB
library_kiosktablekiosk_accounts -
Confirm by displaying username and student_id back to browser. (2 points)
-
Part 3: Write the login form (4 points)
Write a single PHP file (e.g. login.php) that:
-
Shows a form with 2 fields:
usernameandpin. (1 point) -
On submit: check against DB for correct username–pin pair (hash compare).
-
If correct: display welcome message “Welcome to Library Kiosk, USERNAME” (1 point)
-
If incorrect: display “Invalid username or PIN” + show the login form again. (2 points)
-
Part 4: Write the reset PIN form (4 points)
Write a single PHP file (e.g. reset_pin.php) to reset PIN using username + student_id:
-
Display a form with fields:
username,student_id. (1 point) -
If username and student_id match in DB:
-
Generate random alphanumeric PIN (reasonable length)
-
Update DB with SHA-1 hash of the new PIN
-
Display the newly generated PIN to the user. (2 points)
-
-
If not match:
-
Inform failure and display reset form below the message. (1 point)
-
Part 5: Write the change PIN form (4 points)
Write a single PHP file (e.g. change_pin.php) to change PIN:
-
Form fields:
username,current_pin,new_pin. (1 point) -
On submit:
-
Verify username + current_pin
-
If correct: update
PIN_HASHto new hash and show success message. (2 points) -
If incorrect: do not update; show failure message and the form again. (1 point)
-
Suggested file list (not required)
-
db.php -
register.php -
login.php -
reset_pin.php -
change_pin.php

