1. Khái niệm về dữ liệu tĩnh trong PHP

Trong lập trình hướng đối tượng ta có thể hiểu rằng dữ liệu tĩnh sử dụng ở dạng toàn cục. Dù ở file nào thì sẽ đều được lưu lại trong lớp. Mỗi thành viên đều có mức truy cập private, protected và public bình thường.

Khi sử dụng đến thành viên tĩnh này thì ta truy xuất dữ liệu trực tiếp mà không cần khởi tạo object. Cùng với đó là có thể gọi các hàm tĩnh trong nội bộ của class. Vì ở dạng toàn cục nên khi khởi tạo không cần từ khóa $this, và trong phương thức tĩnh thì chỉ gọi được những phương thức và thuộc tính cùng class ở dạng tĩnh.

2. Static trong OOP

2.1. Static là gì?

Static trong lập trình hướng đối tượng là một thành phần tĩnh(thuộc tính hoặc phương thức) mà nó hoạt động như một biến toàn cục dù cho được xủ lý ở trong bất kỳ file nào đi nữa thì nó đều lưu lại giá trị cuối cùng mà nó được thực hiện vào trong lớp. Static có thể được gọi mà không cần đối tượng của class đó vì thế mà các thuộc tính hoặc phương thức của static có thể được gọi ở bất cứ đâu.

2.2. Cách khai báo Static

Để khai báo một thuộc tính hay một phương thức là static thì ta chỉ cần thêm từ khóa static sau vibsility(là mức truy cập public, private hoặc protected).

Cú pháp:

visibility static $name;
visibility static function getName() {}

Ví dụ:

<?php
class ClassName {
  public static function staticMethod() {
    echo "Hello World!";
  }
}
?>

Và để truy cập một phương thức tĩnh ta dùng tên lớp rồi đến toán tử :: và tên phương thức.

ClassName::staticMethod();

2.3. Gọi thành phần tĩnh

Khi ta khai báo một thuộc tính hay phương thức ở dạng static thì ta sẽ không thể gọi bằng các thông thường bằng từ khóa this mà ta sẽ có những các khác nhau

  • Gọi phương thức và thuộc tính tĩnh trong class

Để gọi phương thức và thuộc tính trong class thì ta có thể sử dụng một trong 3 cú pháp: selft::ten hoặc ClassName::ten hoặc static::ten.

Ví dụ:

class ConNguoi
{
    private static $name = 'Thành Nguyễn';

    public static function getName()
    {
        //gọi thuộc tính tĩnh
        return self::$name;
        //hoặc
        return ConNguoi::$name;
    }

    public function showAll()
    {
        //gọi phương thức tĩnh
        return self::getName();
        //hoặc 
        return ConNguoi::getName();
    }
}
  • Gọi các phương thức và thuộc tính ngoài class

Để gọi phương thức tĩnh bên ngoài class thì chúng ta có thể gọi bằng các truyền thống hoặc gọi theo cú pháp ClassName::tenPhuongThuc(), còn đối với thuộc tính tĩnh thì chúng ta chỉ được sử dụng theo cú pháp ClassName::tenPhuongThuc() còn không được sử dụng theo cách truyền thống.

Ví dụ:

class ConNguoi
{
    public static $name = 'thành nguyễn';

    public static function getName()
    {
        //gọi thuộc tính tĩnh
        return self::$name;
        //hoặc
        return ConNguoi::$name;
    }

    public static function showAll()
    {
        //gọi phương thức tĩnh
        return self::getName();
        //hoặc 
        return ConNguoi::getName();
    }
}

//gọi thuộc tính tĩnh
ConNguoi::$name;
//gọi phương thức tĩnh
ConNguoi::showAll();
//hoặc
$connguoi = new ConNguoi();
$connguoi->showAll();
  • Kế thừa khi sử dụng static

Tính kế thừa thì không có gì mới ta sẽ sử dụng như các truyền thống chỉ khác là ta sẽ dùng toán tử :: để truy xuất đến hàm tĩnh của lớp cha.

Ví dụ:

// Lớp động vật
class Animal 
{
    protected static $_name = '';
     
    public static function setName($name)
    {
        Animal::$_name = $name;
    }
     
    public static function getName(){
        return Animal::$_name;
    }
}
 
class ConHeo extends Animal
{
     
    public static function setName($name) {
        parent::setName($name);
    }
     
}
 
ConHeo::setName('Con Heo');
echo ConHeo::getName();
// Kết quả: COn Heo

2.4. Ưu và nhược điểm của static

Ưu điểm của việc sử dụng phương thức và thuộc tính tĩnh là ta có thể thay đổi dữ liệu toàn cục cho đối tượng đó, không cần khởi tạo đối tượng mới mà ta vẫn sử dụng được. Tuy nhiên vì nó hoạt động như một biến toàn cục nên nó sẽ chiếm nhiều tài nguyên hơn bình thường.

3. Self trong PHP

Ta không truy cập được vào thuộc tính static với $this. Vậy làm thế nào để sử dụng thuộc tính static trong lớp? Ta sẽ sử dụng static và self. Đồng thời một lớp có thể có cả thuộc tính, phương thức tĩnh và không tĩnh. Một thuộc tính, phương thức tĩnh có thể được truy cập từ một phương thức, thuộc tính trong cùng một lớp bằng cách sử dụng self và toán tử ::

Ví dụ:

<?php
class pi {
  public static $value=3.14159;
  public function staticValue() {
    return self::$value;
  }
}

$pi = new pi();
echo $pi->staticValue();
class greeting {
  public static function welcome() {
    echo "Hello World!";
  }

  public function __construct() {
    self::welcome();
  }
}

new greeting();
?>
  • Các phương thức tĩnh cũng có thể được gọi từ các phương thức trong các lớp khác. Để làm được điều này phương thức tĩnh phải là public
<?php
class greeting {
  public static function welcome() {
    echo "Hello World!";
  }
}

class SomeOtherClass {
  public function message() {
    greeting::welcome();
  }
}
?>
  • Để gọi một thuộc tính tĩnh từ một lớp con, ta sử dụng từ khóa parent bên trong lớp con.
<?php
class pi {
  public static $value=3.14159;
}

class x extends pi {
  public function xStatic() {
    return parent::$value;
  }
}

// Get value of static property directly via child class
echo x::$value;

// or get value of static property via xStatic() method
$x = new x();
echo $x->xStatic();
?>