2012-11-21 11 views
6

Thông báo này hiển thị trong php 5.4 vì một lý do lạ.Tiêu chuẩn nghiêm ngặt: Mô hình hàm tĩnh :: tableStruct() không được trừu tượng trong

Lớp học của tôi trông như thế này:

abstract class model{ 

    private static 
    $tableStruct = array(); 

    abstract protected static function tableStruct(); 

    public static function foo(){ 
    if(!isset(self::$tableStruct[get_called_class()])) 
     self::$tableStruct[get_called_class()] = static::tableStruct(); 

    // I'm using it here!! 
    } 

} 

và nên được sử dụng như:

class page extends model{ 

    protected static function tableStruct(){ 
    return array(
     'id' => ... 
     'title' => ... 
    ); 
    } 

    ... 

} 

Tại sao thực hiện một phương pháp tĩnh theo yêu cầu của lớp trẻ được coi là chống lại các tiêu chuẩn?

+0

Nó không chỉ là 5.4, nó được như thế trong một thời gian. Xem [câu hỏi tương tự] (http://stackoverflow.com/questions/999066/why-does-php-5-2-disallow-abstract-static-class-methods). –

Trả lời

7

Phương pháp tĩnh trừu tượng là một khái niệm kỳ lạ. Một phương pháp tĩnh về cơ bản "mã cứng" phương thức cho lớp, đảm bảo chỉ có một cá thể đơn (~ singleton). Nhưng làm cho nó trừu tượng có nghĩa là bạn muốn ép buộc một số lớp khác thực hiện nó.

Tôi thấy những gì bạn đang cố gắng làm, nhưng khi giao dịch với các lớp trừu tượng, tôi sẽ tránh các phương thức tĩnh trong lớp cơ sở. Những gì bạn có thể làm thay vì sử dụng cuối tĩnh ràng buộc (static: :) để gọi một phương thức tableStruct trong lớp "con". Điều này không ép buộc phương thức được triển khai như trừu tượng, nhưng bạn có thể kiểm tra việc thực hiện và ném một ngoại lệ nếu nó không tồn tại.

public static function foo(){ 
    // call the method in the child class 
    $x = static::tableStruct(); 
} 
+0

"... khi xử lý các lớp trừu tượng, tôi sẽ tránh các phương thức tĩnh trừu tượng trong lớp cơ sở". Bạn có thể đưa ra ví dụ thực tế khi sử dụng phương pháp tĩnh trừu tượng sẽ bị tổn thương không? – user151851

+1

tham chiếu tĩnh tạo khớp nối chặt chẽ. phương pháp tĩnh nói chung làm cho thử nghiệm khó khăn bởi vì rất khó để thay thế các lớp học với một đối tượng giả. –

3

Đối với những gì nó có giá trị ...

giao diện Lạm dụng:

interface Imodel { 

    static function tableStruct();   
} 

abstract class model implements Imodel { 

    private static $tableStruct = array(); 

    public static function foo() { 
     if (!isset(self::$tableStruct[get_called_class()])) 
      self::$tableStruct[get_called_class()] = static::tableStruct(); 

     // I'm using it here!! 
    } 
}