Toán tử :: và từ khóa static

Toán tử :: với từ khóa self và parent

Khác với $this để truy cập đến object, self trỏ đến class hiện tại, parent trỏ đến class cha. Khi sử dụng selfparent hãy sử dụng với toán tử ::

Xem ví dụ sau để biết khác nhau giữa $thisself.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class Animal {
  public function whichClass() {
    echo "Tôi là một loài động vật \n";
  }
  public function saySelfClassName() {
    self::whichClass();
  }
  public function sayThisClassName() {
    $this->whichClass();
  }
}

class Tiger extends Animal {
  public function whichClass() {
    echo "Tôi là một con hổ \n";
  }
  public function sayParentClassName() {
    parent::whichClass();
  }
}

$tigerObj = new Tiger();
$tigerObj->saySelfClassName(); // -> Tôi là một loài động vật
$tigerObj->sayThisClassName(); // -> Tôi là một con hổ
$tigerObj->sayParentClassName(); // -> Tôi là một loài động vật

Từ khóa static

Thuộc tính static là thuộc tính có thể sử dụng mà không cần tạo object. Khi truy cập từ khóa static từ class hãy dùng toán tử :: Thuộc tính static tương tự như hằng số trong class, chỉ khác là thuộc tính static thì thay đổi được giá trị.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
class Foo {
  public static $my_static = 'foo';
  public function staticValue() {
    // Truy cập đến thuộc tính static qua self::
    return self::$my_static;
  }
}
print Foo::$my_static . "\n"; // -> foo
print (new Foo())->staticValue(); // -> foo

Hàm static chỉ truy cập được vào thuộc tính static, hàm static khác hoặc hằng số.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
class OtherClass {
  const CONST_VALUE = 'Giá trị hằng số';
  public static $my_static = 'static var';
  public static function doubleColon() {
    // thay vì sử dụng self có thể sử dụng tên class
    echo OtherClass::CONST_VALUE . "\n";
    echo self::$my_static . "\n";
  }
}
OtherClass::doubleColon();

Late Static Bindings với static::

Late Static Bindings là ràng buộc muộn, tương tự như biến $this nhưng dùng cho phương thức hoặc thuộc tính static.

Ví dụ sau chúng ta không thể sử dụng biến $this được vì đang ở trong hàm static. Thay vào đó chúng ta sẽ sử dụng static::

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class A {
  public static function who() {
    echo __CLASS__ . "\n"; // A
  }
  public static function test_self() {
    self::who();
  }
  public static function test_static() {
    static::who();
  }
}

class B extends A {
  public static function who() {
    echo __CLASS__ . "\n"; // B
  }
}

B::test_self(); // -> A
B::test_static(); // -> B