Trong lập trình hướng đối tượng (OOP), ngoài các phương thức thông thường, PHP còn cung cấp phương thức tĩnh (static methods). Static methods là các phương thức có thể được gọi trực tiếp từ class mà không cần phải tạo đối tượng từ class đó. Điều này giúp tăng hiệu suất và làm cho mã nguồn của bạn trở nên linh hoạt hơn trong các tình huống mà bạn chỉ cần thực hiện các hành động không phụ thuộc vào trạng thái cụ thể của đối tượng.

Trong bài viết này, chúng ta sẽ khám phá chi tiết về static methods, cách sử dụng và các trường hợp nên áp dụng.

1. Static Method là gì?

Phương thức tĩnh (static method) là phương thức thuộc về class thay vì đối tượng của class. Phương thức tĩnh có thể được gọi trực tiếp thông qua tên class mà không cần khởi tạo đối tượng. Những phương thức này thường được sử dụng khi bạn cần thực hiện các thao tác không phụ thuộc vào dữ liệu cụ thể của đối tượng (instance) mà chỉ phụ thuộc vào bản thân class.

Cú pháp khai báo phương thức tĩnh

php
class ClassName {
    public static function methodName() {
        // Nội dung phương thức
    }
}
  • static: Từ khóa để khai báo phương thức tĩnh.
  • Phương thức tĩnh chỉ có thể truy cập các thuộc tính và phương thức tĩnh khác trong cùng một class.

2. Ví dụ về Static Method

Dưới đây là ví dụ đơn giản về phương thức tĩnh trong PHP:

php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
}

// Gọi phương thức tĩnh mà không cần khởi tạo đối tượng
echo MathHelper::add(5, 10);  // Output: 15

Giải thích:

  • Phương thức add() được khai báo là tĩnh với từ khóa static. Phương thức này nhận hai tham số và trả về tổng của chúng.
  • Phương thức tĩnh add() được gọi trực tiếp thông qua tên class MathHelper mà không cần phải tạo đối tượng từ class này.

3. Truy cập phương thức tĩnh từ bên trong class

Trong một class, bạn có thể truy cập các phương thức tĩnh khác của class bằng cách sử dụng từ khóa self:: thay vì $this->. Điều này là do các phương thức tĩnh không liên quan đến đối tượng cụ thể mà thuộc về toàn bộ class.

Ví dụ:

php
class Converter {
    public static function toUpperCase($string) {
        return strtoupper($string);
    }

    public static function convertAndPrint($string) {
        $upperCaseString = self::toUpperCase($string);
        echo $upperCaseString;
    }
}

Converter::convertAndPrint("hello world");  // Output: HELLO WORLD

Giải thích:

  • Phương thức tĩnh convertAndPrint() gọi phương thức tĩnh khác toUpperCase() bằng cách sử dụng self:: để chuyển chuỗi thành chữ hoa và in kết quả.
  • Cả hai phương thức tĩnh đều được gọi mà không cần tạo đối tượng từ class Converter.

4. Phương thức tĩnh trong kế thừa (Static Methods in Inheritance)

Phương thức tĩnh cũng có thể được kế thừa từ class cha và ghi đè trong class con. Tuy nhiên, khi truy cập phương thức tĩnh từ class con, chúng ta cần lưu ý đến việc sử dụng từ khóa static:: hoặc self:: để gọi phương thức.

Ví dụ về kế thừa với phương thức tĩnh:

php
class ParentClass {
    public static function showMessage() {
        echo "Message from ParentClass\n";
    }
}

class ChildClass extends ParentClass {
    public static function showMessage() {
        echo "Message from ChildClass\n";
    }

    public static function callParentMessage() {
        parent::showMessage();  // Gọi phương thức tĩnh từ class cha
    }
}

// Gọi phương thức tĩnh từ class con
ChildClass::showMessage();  // Output: Message from ChildClass
ChildClass::callParentMessage();  // Output: Message from ParentClass

Giải thích:

  • Class ChildClass ghi đè phương thức tĩnh showMessage() của class cha ParentClass.
  • Khi gọi phương thức showMessage() từ class con, phương thức trong class con sẽ được ưu tiên.
  • Sử dụng parent::showMessage() để gọi phương thức tĩnh từ class cha bên trong class con.

5. Sự khác biệt giữa Static Methods và Non-static Methods

Static MethodsNon-static Methods
Có thể được gọi mà không cần tạo đối tượng.Chỉ có thể được gọi khi đã tạo đối tượng từ class.
Không thể truy cập các thuộc tính hoặc phương thức không tĩnh.Có thể truy cập tất cả các thuộc tính và phương thức của đối tượng.
Thích hợp cho các chức năng không phụ thuộc vào trạng thái của đối tượng.Thích hợp cho các hành vi phụ thuộc vào dữ liệu cụ thể của đối tượng.
Được gọi thông qua tên class (ClassName::method()).Được gọi thông qua đối tượng (instance->method()).

6. Truy cập thuộc tính tĩnh trong phương thức tĩnh

Phương thức tĩnh có thể truy cập thuộc tính tĩnh của class bằng cách sử dụng từ khóa self:: hoặc static::. Tuy nhiên, phương thức tĩnh không thể truy cập trực tiếp các thuộc tính không tĩnh vì các thuộc tính không tĩnh thuộc về đối tượng, không phải class.

Ví dụ:

php
class Config {
    public static $defaultLanguage = "English";

    public static function getDefaultLanguage() {
        return self::$defaultLanguage;  // Truy cập thuộc tính tĩnh
    }
}

echo Config::getDefaultLanguage();  // Output: English

Giải thích:

  • Thuộc tính tĩnh $defaultLanguage được truy cập bên trong phương thức tĩnh getDefaultLanguage() bằng từ khóa self::.
  • Không cần khởi tạo đối tượng để truy cập phương thức và thuộc tính tĩnh.

7. Khi nào nên sử dụng Static Methods?

Sử dụng phương thức tĩnh trong các trường hợp sau:

  • Các tiện ích hoặc chức năng chung: Khi bạn cần một phương thức thực hiện các chức năng không phụ thuộc vào dữ liệu của đối tượng, chẳng hạn như các hàm toán học, xử lý chuỗi, hoặc chuyển đổi dữ liệu.Ví dụ: Một class Math chứa các phương thức tĩnh để thực hiện các phép toán như add(), subtract(), multiply(), v.v.
php
class Math
{
    public static function add($a, $b)
    {
        return $a + $b;
    }
}
  • Giữ nguyên các giá trị toàn cục: Các phương thức tĩnh rất hữu ích khi bạn cần lưu giữ và quản lý các giá trị toàn cục mà không muốn tạo các đối tượng để lưu trữ chúng. Ví dụ như cài đặt cấu hình ứng dụng.
  • Truy cập nhanh: Khi bạn không muốn tạo đối tượng chỉ để gọi một phương thức nhỏ, phương thức tĩnh giúp giảm tài nguyên và tối ưu hóa hiệu suất.
  • Tạo phương thức nhà máy (Factory methods): Các phương thức tĩnh thường được sử dụng để tạo ra đối tượng (design pattern "Factory") mà không cần khởi tạo trực tiếp.
php
class Car
{
    public static function create($brand)
    {
        $car = new Car();
        $car->brand = $brand;
        return $car;
    }
}

$myCar = Car::create('Toyota');

8. Hạn chế của Static Methods

  • Không thể truy cập thuộc tính và phương thức không tĩnh: Phương thức tĩnh không thể truy cập các thuộc tính và phương thức của đối tượng (non-static) vì nó không có quyền truy cập vào đối tượng cụ thể nào.
  • Giảm tính linh hoạt của OOP: Nếu bạn sử dụng quá nhiều phương thức tĩnh, mã của bạn có thể mất đi một số tính năng hữu ích của OOP như tính kế thừa, đa hình và trừu tượng.

9. Kết luận

Static Methods trong PHP là một công cụ hữu ích cho các tình huống không cần trạng thái của đối tượng và bạn chỉ muốn thực hiện một số chức năng chung. Sử dụng static methods giúp mã nguồn gọn gàng và hiệu quả hơn trong việc cung cấp các chức năng không phụ thuộc vào đối tượng. Tuy nhiên, static methods cũng có hạn chế và không nên lạm dụng chúng, đặc biệt khi bạn cần tận dụng đầy đủ các tính năng của OOP như kế thừa và đa hình.

Trong bài học tiếp theo, chúng ta sẽ khám phá thêm các khái niệm và tính năng nâng cao khác trong lập trình hướng đối tượng với PHP, giúp bạn phát triển các ứng dụng mạnh mẽ và linh hoạt hơn.