Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Nhìn chung thì cả self
và static
đều dùng để gọi các thành phần tĩnh trong đối tượng, nhưng nếu chỉ đơn thuần như trong nội bộ class thì cả 2 keywords
này đều cho ra kết quả tốt.
VD:
class ConNguoi
{
private static $name = 'ConNguoi';
public function getName()
{
echo self::$name;
echo '<br >';
echo static::$name;
}
}
ConNguoi::getName();
Kết Quả:
ConNguoi
ConNguoi
Vậy liệu nó có cho ra các giá trị khác nhau khi chúng ta sử dụng tính kế thừa trong class? Để biết rõ hơn thì chúng ta sẽ tạ ra các ví dụ để so sánh nó.
Vẫn là class ConNguoi như trên nhưng chúng ta sẽ khai báo thêm một class NguoiLon kế thừa class ConNguoi và override lại thuộc tính $$ame như sau:
<?php
class ConNguoi
{
private static $name = 'ConNguoi';
public function getName()
{
echo self::$name;
echo '<br >';
echo static::$name;
}
}
class NguoiLon extends ConNguoi
{
private static $name = 'NguoiLon';
}
NguoiLon::getName();
Sau khi chạy dòng trên thì mình thu được kết quả như sau:
ConNguoi
Fatal error: Cannot access private property NguoiLon::$name
Như các bạn đã thấy: Đối với self thì kết quả chạy như bình thường, còn với static thì sao nó lại báo là không thể truy cập vào thuộc tính private mà lại là NguoiLon::name, phải chăng thằng static này đại diện cho đối tượng hiện tại nên không thể truy xuất được đến thuộc tính name. Thôi được rồi, để chắc ăn hơn thì mình thử đổi visibility của biến $name thành protected xem sao?
<?php
class ConNguoi
{
protected static $name = 'ConNguoi';
public function getName()
{
echo self::$name;
echo '<br>';
echo static::$name;
}
}
class NguoiLon extends ConNguoi
{
protected static $name = 'NguoiLon';
}
// NguoiLon::getName();
$a = new NguoiLon();
$a->getName();
Và đây là kết quả mình nhận được:
ConNguoi
NguoiLon
Giờ đã chạy được ngon lành, nhưng khi nó lại cho ra 2 kết quả khác nhau. Từ 2 ví dụ trên chúng ta tạm đưa ra kết luận là static nó có nguyên tắc gần như $this, là đều truy xuất đến đối tượng hiện tại.
Để ok hơn nữa thì mình sẽ tiếp tục tạo ra ví dụ sau và chạy nó:
<?php
class ConNguoi
{
protected static $name = 'ConNguoi';
public function getSelf()
{
return new self;
// or
// return new static();
}
public function getStatic()
{
return new static;
// or
// return new static();
}
}
class NguoiLon extends ConNguoi
{
}
echo get_class(NguoiLon::getSelf()); //ConNguoi
echo get_class(NguoiLon::getStatic()); //NguoiLon
Ok, nó đã chạy được và cho ra kết quả giống với kết luận ở trên. Lúc này thì chẳng cần phải ngại ngần gì nữa mà không dám kết luận khẳng định.
Như vậy mình đã giới thiệu xong đến mọi người về sự khác nhau của self và static trong PHP, ngoài ra các bạn có thể xem thêm bài so sánh giữa this và self trong PHP của mình tại đây.
Tham khảo: toidicode.com, viblo.asia.