2012-11-21 18 views
6

में सार नहीं होना चाहिए यह संदेश कुछ अजीब कारणों से php 5.4 में दिखाया गया है।सख्त मानकों: स्टेटिक फ़ंक्शन मॉडल :: tableStruct()

मेरी कक्षा इस तरह दिखता है:

class page extends model{ 

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

    ... 

} 

क्यों एक स्थिर विधि बच्चे कक्षाओं के लिए आवश्यक बनाने के मानकों के खिलाफ माना जाता है:

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!! 
    } 

} 

और की तरह इस्तेमाल किया जाना चाहिए?

+0

यह केवल 5.4 नहीं है इसके कि थोड़ी देर के लिए की तरह किया गया। [समान प्रश्न] देखें (http://stackoverflow.com/questions/999066/why-does-php-5-2-disallow-abstract-static-class-methods)। –

उत्तर

7

सार स्थिर विधियां एक अजीब अवधारणा की तरह हैं। एक स्थैतिक विधि मूल रूप से कक्षा के लिए "हार्ड कोड" विधि, सुनिश्चित करें कि केवल एक ही उदाहरण (~ सिंगलटन) है। लेकिन इसे अमूर्त बनाने का मतलब है कि आप इसे लागू करने के लिए किसी अन्य वर्ग को मजबूर करना चाहते हैं।

मैं देखता हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन अमूर्त कक्षाओं से निपटने पर, मैं बेस क्लास में स्थिर तरीकों से बचूंगा। इसके बजाय आप क्या कर सकते हैं देर से स्थैतिक बाध्यकारी (स्थिर: :) का उपयोग टेबल को कॉल करने के लिए "बच्चे" वर्ग में स्ट्रक्चर विधि। यह अमूर्त की तरह लागू करने के लिए विधि को मजबूर नहीं करता है, लेकिन आप कार्यान्वयन के लिए परीक्षण कर सकते हैं और अपवाद फेंक सकते हैं यदि यह अस्तित्व में नहीं है।

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

"... अमूर्त वर्गों से निपटने पर, मैं बेस क्लास में [सार] स्थिर तरीकों से बचूंगा।" क्या आप एक व्यावहारिक उदाहरण दे सकते हैं जहां एक अमूर्त स्थिर विधि का उपयोग करना चोट पहुंचाएगा? – user151851

+1

स्थैतिक संदर्भ तंग युग्मन बनाते हैं। सामान्य रूप से स्थिर तरीके परीक्षण को कठिन बनाते हैं क्योंकि क्लास को नकली ऑब्जेक्ट से प्रतिस्थापित करना मुश्किल होता है। –

3

क्या इसके लायक है के लिए ...

कोस इंटरफेस:

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!! 
    } 
}