Thuộc tính và phương thức Static trong lập trình hướng đối tượng OOP

Trong một vài trường hợp, bạn có nhu cầu truy cập trực tiếp đến thuộc tính hoặc phương thức mà không muốn tạo đối tượng của lớp thì phương thức Static sẽ giúp bạn. Cùng tìm hiểu nhé.

I. Tìm hiểu về Static trong lập trình hướng đối tượng OOP

1. Static là gì?

Static trong lập trình hướng đối tượng OOP là một thành phần tĩnh có thể là thuộc tính hoặc phương thức.

2. Cách khai báo static

Để khai báo một phương thức hay một thuộc tính static thì ta dùng từ khoá static

<?php
class ClassName {
  // Khai báo thuộc tính static
  public static $staticProp = "kiemtientuweb.com";
  // Khai báo phương thức static
  public static function staticMethod() {
    echo "Hello World!";
  }
}
?>

 II. Cách sử dụng phương thức static

Một class có thể có cả phương thức static và phương thức bình thường.

Một phương thức static có thể được truy cập từ một phương thức khác trong cùng một class bằng cách sử dụng từ khóa self và dấu ký tự phạm vi ::

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

  public function __construct() {
    self::welcome(); //Cách 1
    Hello::welcome(); //Cách 2
  }
}

new Hello();
?>

Các phương thức static cũng có thể được gọi từ các phương thức khác trong các lớp khác. Tuy nhiên phương thức static phải có phạm vi truy cập là public.

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

class Hi {
  public function message() {
    Hello::welcome();
  }
}
?>

Để gọi một phương thức static từ một class con, ta sử dụng từ khóa parent bên trong class con. Và tất nhiên phương thức static phải có phạm vi truy cập public hoặc protected.

<?php
class Domain {
  protected static function getWebsiteName() {
    return "kiemtientuweb.com";
  }
}

class MyDomain extends Domain {
  public $websiteName;
  public function __construct() {
    $this->websiteName = parent::getWebsiteName();
  }
}

$my_domain = new MyDomain();
echo $my_domain ->websiteName;
?>

 

III. Cách sử dụng thuộc tính static

Tương tự như phương thức static thì ta cũng có một class có thể có cả thuộc tính static và thuộc tính bình thường.

Một thuộc tính static có thể được truy cập từ một phương thức khác trong cùng một class bằng cách sử dụng từ khóa self và dấu ký tự phạm vi ::

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

$pi = new pi();
echo $pi->staticValue();
?>

Để gọi một thuộc tính static từ một class con được kế thừa, ta sử dụng từ khóa parent bên trong class 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();
?>

Tóm lại có 3 cách gọi một thuộc tính và phương thức static

  • Gọi thuộc tính static hay phương thức static trong phương thức bình thường cùng class thì dùng từ khoá self :: hoặc tên class::
  • Gọi thuộc tính static hay phương thức static ngoài các class không liên quan nhau thì dùng tên class::
  • Gọi thuộc tính static hay phương thức static bên trong class được thừa kế thì dùng từ khoá parent ::

Lưu ý: Thuộc tính static hoạt động như một biến toàn cục, dù cho nó có được xử lý ở trong bất kỳ một file nào đi nữa (trong cùng một chương trình) thì nó đều lưu lại giá trị cuối cùng mà nó được thực hiện vào trong class. Xem 2 ví dụ dưới để hiểu hơn.

Ví dụ ta có đoạn mã sau không sử dụng static

class Person
{
    private $name = 'Ha Anh Tuan';

    public function setName($name)
    {
        $this->name = $name;
    }

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

//Khởi tạo đối tượng person
$person = new Person();
$person->setName('Hoàng Thuỳ Linh');
echo $person->getName();   //Kết quả: Hoàng Thuỳ Linh

//khởi tạo thêm 1 đối tượng khác
$student = new Person();
echo $student->getName();  // Kết quả: Ha Anh Tuan

Và đoạn mã có sử dụng static

class Person
{
    private static $name = 'Ha Anh Tuan';

    public function setName($name)
    {
        self::$name = $name;
    }

    public function getName()
    {
        return self::$name;
    }
}

//Khởi tạo đối tượng person
$person = new Person();
$person->setName('Hoàng Thuỳ Linh');
echo $person->getName();   //Kết quả: Hoàng Thuỳ Linh

//khởi tạo thêm 1 đối tượng khác
$student = new Person();
echo $student->getName();  // Kết quả:  Hoàng Thuỳ Linh

Bài viết nên đọc

Trên đây là những kiến thức từ kinh nghiệm bản thân mình nên các bạn có thể tham khảo. Nếu các bạn có góp ý cho mình thì hãy gửi vào đây, mình sẵn sàng nhận ý kiến đóng góp từ các bạn.

Ngoc Phuong

Ngoc Phuong - 82 bài viết - Đánh giá:

Có 2 cách học hiệu quả nhất, 1 là nói cho người khác biết thứ bạn mới học được, 2 là nói cho người khác biết thứ bạn sắp quên. Tôi mới học được rất nhiều thứ. Tôi cũng sắp quên rất nhiều thứ.

Để lại bình luận

Địa chỉ email của bạn sẽ không được công khai