2010-07-03 58 views
12
<?php 
class Base { 
    protected static $c = 'base'; 

    public static function getC() { 
    return self::$c; 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC(); // output "base" 
echo Derived::getC(); // output "base", but I need "derived" here! 
?> 

Giải pháp tốt nhất là gì?Ghi đè các thành viên tĩnh trong các lớp dẫn xuất trong PHP

+7

thay thế tự :: $ c với tĩnh :: $ c – Artefacto

+0

@Artefacto Cảm ơn, điều đó hoạt động tốt! –

Trả lời

9

Cách tốt nhất để giải quyết vấn đề này là nâng cấp lên PHP 5.3, trong đó late static bindings khả dụng. Nếu đó không phải là một lựa chọn, bạn sẽ không may phải thiết kế lại lớp học của mình.

+0

PHP 5.3 có tương thích với PHP 5.2 không? Máy chủ của tôi vẫn chạy trên 5.2 – powerboy

+3

@powerboy Tương thích ngược **, nghĩa là các tập lệnh được viết cho 5.2 sẽ chạy trên 5.3, phần lớn nhất. Một số điều nhỏ có thể đã thay đổi. Xem tại đây: http://www.php.net/manual/en/migration53.php – deceze

0

Bạn phải sử dụng lại phương pháp lớp cơ sở; hãy thử với:

class Derived extends Base { 
    protected static $c = 'derived'; 

    public static function getC() { 
    return self::$c; 
    } 
} 

Như bạn thấy, giải pháp này rất vô ích, vì buộc viết lại tất cả các phương thức được phân lớp.

Giá trị của self::$c chỉ phụ thuộc vào lớp nơi phương thức đã thực sự được triển khai, không phải lớp mà từ đó nó được gọi.

3

Dựa trên đầu vào của lừa đảo và đầu vào của Undolog: Hoàn tác là đúng, đối với PHP < = 5.2.

Nhưng với 5.3 và cuối bindings tĩnh nó sẽ làm việc, chỉ cần sử dụng tĩnh thay vì tự bên trong hàm - bây giờ nó sẽ làm việc ... // THX @ deceze cho gợi ý

cho chúng ta sao chép qua quét mẫu người dùng stackoverflow - điều này sẽ hoạt động:

class Base { 
    protected static $c = 'base'; 
    public static function getC() { 
    return static::$c; // !! please notice the STATIC instead of SELF !! 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC();  // output "base" 
echo Derived::getC(); // output "derived" 
Các vấn đề liên quan