2010-05-18 16 views
27

मैंने एक अमूर्त अभिभावक वर्ग स्थापित किया है, और एक ठोस वर्ग जो इसे विस्तारित करता है। अभिभावक वर्ग अमूर्त कार्य क्यों नहीं कर सकता?आप PHP में अमूर्त कक्षाओं से अमूर्त कार्यों को क्यों नहीं बुला सकते?

//foo.php 
<?php 
    abstract class AbstractFoo{ 
     abstract public static function foo(); 
     public static function getFoo(){ 
      return self::foo();//line 5 
     } 
    } 

    class ConcreteFoo extends AbstractFoo{ 
     public static function foo(){ 
      return "bar"; 
     } 
    } 

    echo ConcreteFoo::getFoo(); 
?> 

त्रुटि:

Fatal error: Cannot call abstract method AbstractFoo::foo() in foo.php on line 5

+3

एलओएल ... स्थिर अमूर्त ...: डी: ठंडा सवाल – Simon

उत्तर

48

यह एक सही कार्यान्वयन है; आप late static bindings का उपयोग करने के क्रम में स्थिर, नहीं स्वयं का उपयोग करना चाहिए,:

abstract class AbstractFoo{ 
    public static function foo() { 
     throw new RuntimeException("Unimplemented"); 
    } 
    public static function getFoo(){ 
     return static::foo(); 
    } 
} 

class ConcreteFoo extends AbstractFoo{ 
    public static function foo(){ 
     return "bar"; 
    } 
} 

echo ConcreteFoo::getFoo(); 

की उम्मीद "बार" देता है।

ध्यान दें कि यह वास्तव में बहुरूपता नहीं है। स्थैतिक कुंजीपटल को उस वर्ग में हल किया गया है जिससे स्थैतिक विधि को बुलाया गया था। यदि आप एक अमूर्त स्थैतिक विधि घोषित करते हैं, तो आपको सख्त चेतावनी मिल जाएगी। PHP केवल माता-पिता (उप) वर्ग से सभी स्थिर तरीकों की प्रतिलिपि बनाता है यदि वे बच्चे (उप) वर्ग में मौजूद नहीं हैं।

+2

बीमार में 'कंक्रीट क्लास' संदर्भित करने के लिए 'स्थिर 'है ... धन्यवाद! आत्म और स्थैतिक के बीच क्या अंतर है? संपादित करें: जाहिर है कि कीवर्ड मौजूद नहीं है (संस्करण संस्करण हो सकता है)। – Cam

+2

मैंने जो देर से स्थिर बाइंडिंग पर लिंक किया है, उसके मैनुअल पेज को पढ़ें। – Artefacto

+1

हां, यह केवल PHP 5.3 पर उपलब्ध है। – Artefacto

7

आप उस शब्द self नोटिस?

वह सार क्लास को इंगित कर रहा है। इस प्रकार यह AbstractClass :: foo() को कॉल कर रहा है, कंक्रीट क्लास :: foo() नहीं;

मेरा मानना ​​है कि पीएचपी 5.3 देर स्थिर बाइंडिंग प्रदान करेगा, लेकिन अगर आप उस संस्करण पर नहीं हैं, स्वयं एक विस्तारित वर्ग का उल्लेख नहीं है, लेकिन वर्ग कि समारोह में स्थित है

देखें:। http://us.php.net/manual/en/function.get-called-class.php

+0

उपयोग करने के लिए 'स्वयं' के बजाय कीवर्ड 5.3 + – philfreo

0

यह एक नियम है कि abstract और static कीवर्ड एक ही समय में एक विधि पर उपयोग नहीं किया जा सकता है।

abstract कीवर्ड के साथ एक विधि का अर्थ है कि उप-वर्ग को इसे लागू करना होगा। किसी वर्ग की विधि में स्थैतिक जोड़ना हमें तत्काल बिना विधि का उपयोग करने की अनुमति देता है।

इसलिए यही कारण है कि त्रुटि होती है।

+0

स्पष्ट उत्तर नहीं है !! – Deepak

+0

और, फिर भी, उनका उपयोग किया जा सकता है। एक उदाहरण PHPUnit के स्थिर setUpBeforeClass() को उप-वर्गों के आधार पर मानों के साथ उपयोग करेगा - आपको एक सार की आवश्यकता होगी (इसलिए सबक्लास इसे पहले स्थान पर और अलग-अलग कार्यान्वित करें) स्थिर (ताकि आप इसे setUpBeforeClass()) विधि से कॉल कर सकें। – Buffalo

संबंधित मुद्दे