Tổng Quan về CLASS VÀ OBJECT (lớp và đối tượng) Trong PHP

Trong PHP, một lớp là một khuôn mẫu cho một đối tượng. Nó chứa các thuộc tính (biến) và phương thức (hàm) của đối tượng đó. Một đối tượng là một thực thể cụ thể của một lớp, với các giá trị cho các thuộc tính và các hành động thực hiện bởi các phương thức. Ví dụ:

Lớp “Person” có thuộc tính “name”, “age”, và “gender”, và phương thức “getName()”, “getAge()”, “getGender()”.

Đối tượng “John” là một thực thể cụ thể của lớp “Person”, với giá trị “John” cho thuộc tính “name”, “30” cho thuộc tính “age”, và “male” cho thuộc tính “gender”.


class Person {
public $name;
public $age;
public $gender;

public function getName() {
return $this->name;
}

public function getAge() {
return $this->age;
}

public function getGender() {
return $this->gender;
}
}

$John = new Person();
$John->name = "John";
$John->age = 30;
$John->gender = "male";

echo $John->getName(); // John
echo $John->getAge(); // 30
echo $John->getGender(); // male

Trong ví dụ trên, ta khai báo lớp Person có 3 thuộc tính và 3 phương thức. Sau đó ta tạo ra đối tượng John thuộc lớp Person và gán giá trị cho các thuộc tính của đối tượng John.

TRUYỀN THAM SỐ VÀO LỚP

Trong PHP, bạn có thể truyền tham số vào lớp bằng cách sử dụng constructor. Constructor là một phương thức được gọi khi tạo mới một đối tượng từ lớp.

Ví dụ:

class Person {
public $name;
public $age;
public $gender;

public function __construct($name, $age, $gender) {
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
}

public function getName() {
return $this->name;
}

public function getAge() {
return $this->age;
}

public function getGender() {
return $this->gender;
}
}

$John = new Person("John", 30, "male");

echo $John->getName(); // John
echo $John->getAge(); // 30
echo $John->getGender(); // male

Trong ví dụ trên, ta đã thêm một constructor vào lớp Person, truyền vào 3 tham số $name, $age, $gender. Khi tạo mới đối tượng John từ lớp Person, ta truyền vào 3 giá trị “John”, 30, “male” cho constructor.

PHƯƠNG THỨC KHỞI TẠO ( __CONSTRUCT() )

Phương thức khởi tạo (__construct()) là một phương thức được gọi khi tạo mới một đối tượng từ một lớp. Nó có thể được sử dụng để khởi tạo các giá trị mặc định cho các thuộc tính của đối tượng, hoặc để thực hiện các tác vụ khác như kết nối đến cơ sở dữ liệu hoặc khởi tạo các đối tượng con.

Ví dụ:

class Person {
public $name;
public $age;
public $gender;

public function __construct($name, $age, $gender) {
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
}

public function getName() {
return $this->name;
}

public function getAge() {
return $this->age;
}

public function getGender() {
return $this->gender;
}
}

$John = new Person("John", 30, "male");

echo $John->getName(); // John
echo $John->getAge(); // 30
echo $John->getGender(); // male

Trong ví dụ trên, phương thức __construct() được gọi khi tạo mới đối tượng John từ lớp Person, với 3 tham số truyền vào là “John”, 30, “male”. Phương thức này sẽ gán giá trị cho các thuộc tính name, age, gender của đối tượng John.

Note: Trong php, nếu không khai báo constructor cho một lớp thì php sẽ tự động tạo một constructor mặc định.

Kế thừa lớp trong PHP

Trong PHP, kế thừa lớp cho phép một lớp con kế thừa tất cả các thuộc tính và phương thức của một lớp cha. Điều này giúp cho việc tái sử dụng mã và giảm sự phức tạp của việc viết lại cùng một đoạn mã nhiều lần.

Để kế thừa lớp trong PHP, bạn sử dụng từ khóa “extends” trong khai báo lớp con.

Ví dụ:

class ParentClass {
public $name;
public $age;

public function getName() {
return $this->name;
}

public function getAge() {
return $this->age;
}
}

class ChildClass extends ParentClass {
public $gender;

public function getGender() {
return $this->gender;
}
}

$John = new ChildClass();
$John->name = "John";
$John->age = 30;
$John->gender = "male";

echo $John->getName(); // John
echo $John->getAge(); // 30
echo $John->getGender(); // male

Trong ví dụ trên, lớp ChildClass kế thừa từ lớp ParentClass, nó sẽ có tất cả các thuộc tính và phương thức của lớp cha, và có thể thêm các thuộc tính và phương thức riêng biệt.

Các phương thức của lớp cha có thể được ghi đè (override) bằng cách khai báo lại chúng trong lớp con với cùng tên.

Còn trong trường hợp muốn sử dụng các phương thức và thuộc tính của lớp cha, ta sử dụng từ khóa “parent::” trước tên phương thức hoặc thuộc tính cần sử dụng.

Ví dụ:

class ParentClass {
public $name;
public $age;

public function getName() {
return $this->name;
}

public function getAge() {
return $this->age;
}
}

class ChildClass extends ParentClass {
public $gender;

public function getGender() {
return $this->gender;
}

public function getFullInfo() {
return parent::getName() . ', ' . parent::getAge() . ', ' . $this->gender;
}
}

$John = new ChildClass();
$John->name = "John";
$John->age = 30;
$John->gender = "male";

echo $John->getFullInfo(); // John, 30, male

Trong ví dụ trên, trong phương thức getFullInfo() của lớp ChildClass, ta sử dụng từ khóa “parent::” để gọi đến phương thức getName() và getAge() của lớp cha.

Lưu ý rằng, trong kế thừa lớp, các thuộc tính và phương thức của lớp cha mặc định là public, nếu muốn truy cập đến chúng trong lớp con thì cần phải khai báo lại với từ khóa public.

VISIBILITY trong lớp trong php

Trong PHP, tính truy cập (visibility) của các thuộc tính và phương thức trong lớp có thể được khai báo bằng các từ khóa public, protected và private.

Public: Các thuộc tính và phương thức được khai báo bằng từ khóa public có thể truy cập từ bất kỳ nơi nào trong chương trình.
Protected: Các thuộc tính và phương thức được khai báo bằng từ khóa protected chỉ có thể truy cập từ chính lớp đó và các lớp kế thừa từ nó.
Private: Các thuộc tính và phương thức được khai báo bằng từ khóa private chỉ có thể truy cập từ chính lớp đó.


class Person {
public $name;
protected $age;
private $ssn;

public function getName() {
return $this->name;
}

protected function getAge() {
return $this->age;
}

private function getSSN() {
return $this->ssn;
}
}

class Employee extends Person {
public function getAge() {
return $this->age;
}
}

$John = new Person();
$John->name = "John";
$John->age = 30;
$John->ssn = "123-45-6789";

echo $John->getName(); // John

$employee = new Employee();
echo $employee->getAge(); // Error: age is protected
echo $employee->getSSN(); // Error: ssn is private

Trong ví dụ trên, thuộc tính $name được khai báo là public và có thể truy cập từ bất kỳ nơi nào. Còn thuộc tính $age được khai báo là protected và chỉ có thể truy cập từ lớp Person và các lớp kế thừa từ nó. Thuộc tính $ssn được khai báo là private và chỉ có thể truy cập từ trong lớp Person.Để truy cập các thuộc tính private ta có thể sử dụng các phương thức getter and setter. Ví dụ:

class Person {
private $ssn;

public function getSSN() {
return $this->ssn;
}

public function setSSN($ssn) {
$this->ssn = $ssn;
}
}

$John = new Person();
$John->setSSN("123-45-6789");

echo $John->getSSN(); // 123-45-6789

Trong ví dụ trên, để truy cập vào thuộc tính $ssn ta sử dụng phương thức getSSN() để lấy giá trị của nó và phương thức setSSN() để thay đổi giá trị của nó.

Lưu ý rằng, khi sử dụng các phương thức getter and setter, các thuộc tính có thể được kiểm tra và xử lý trước khi thay đổi hoặc truy cập.

LỚP TRỪU TƯỢNG (CLASS ABSTRACTION)

Trừu tượng (abstraction) là một kĩ thuật trong lập trình hướng đối tượng, cho phép bạn tập trung vào tính chất chung của một đối tượng hoặc một nhóm đối tượng, bỏ qua chi tiết cụ thể.

Trong PHP, lớp trừu tượng (abstract class) là một loại lớp đặc biệt mà không thể tạo ra đối tượng từ nó, nó chỉ được sử dụng để định nghĩa các hành vi chung cho các lớp con.

Để khai báo một lớp trừu tượng, bạn sử dụng từ khóa “abstract” trước từ khóa “class” trong khai báo lớp. Ví dụ:

abstract class Shape {
abstract public function getArea();
}

class Circle extends Shape {
private $radius;

public function __construct($radius) {
$this->radius = $radius;
}

public function getArea() {
return 3.14 * pow($this->radius, 2);
}
}

$circle = new Circle(5);
echo $circle->getArea(); // 78.5

Trong ví dụ trên, lớp Shape là một lớp trừu tượng và chứa một phương thức trừu tượng getArea(). Lớp Circle kế thừa từ lớp Shape và phải triển khai phương thức getArea() để có thể tạo ra đối tượng.