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;
    }
}

Đăng ký nhận bài viết mới