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 self
và parent
hãy sử dụng với toán tử ::
Xem ví dụ sau để biết khác nhau giữa $this
và self
.
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
|