Bạn phải tự hỏi mình: "Tôi có đang nhắm mục tiêu vấn đề với cách tiếp cận đầy đủ không?"
self::
và static::
làm hai việc khác nhau. Ví dụ: self::
hoặc __CLASS__
là tham chiếu đến lớp hiện tại, do đó được xác định trong phạm vi nhất định, nó sẽ KHÔNG đáp ứng nhu cầu gọi tĩnh về phía trước.
Điều gì sẽ xảy ra trên di sản?
class A {
public static function className(){
echo __CLASS__;
}
public static function test(){
self::className();
}
}
class B extends A{
public static function className(){
echo __CLASS__;
}
}
B::test();
này sẽ in
A
Mặt khác với static::
Nó có hành vi mong đợi
class A {
public static function className(){
echo __CLASS__;
}
public static function test(){
static::className();
}
}
class B extends A{
public static function className(){
echo __CLASS__;
}
}
B::test();
này sẽ in
B
đó được gọi là late static binding in PHP 5.3.0. Nó giải quyết giới hạn gọi lớp là được tham chiếu tại thời gian chạy.
Với ý nghĩ đó, tôi nghĩ giờ đây bạn có thể xem và giải quyết vấn đề một cách đầy đủ. Nếu bạn đang thừa hưởng một số thành viên tĩnh và cần quyền truy cập vào phụ huynh và các thành viên con self::
sẽ không đủ.
Tôi nghĩ 'static' là cách tiếp cận sai lầm ngay từ đầu. Nó có vẻ như (và xin vui lòng sửa nếu sai) bạn chỉ cần thực hiện mã của bạn untestable. – PeeHaa