2010-06-10 11 views
11

मुझे बीए कक्षा में एक स्थिर वर्ग सेट का उपयोग करने में सक्षम होना चाहिए जो बेस क्लास से बेस क्लास को बढ़ाता है।PHP 5.2 में वर्ग विरासत: विस्तार वर्ग में स्थिर चर को ओवरराइड करना?

इस पर विचार करें:

class Animal { 
    public static $color = 'black'; 

    public static function get_color() 
    { 
     return self::$color; 
    } 
} 

class Dog extends Animal { 
    public static $color = 'brown'; 
} 

echo Animal::get_color(); // prints 'black' 
echo Dog::get_color(); // also prints 'black' 

यह पीएचपी 5.3.x में शानदार काम करता है (Dog::get_color() प्रिंट 'ब्राउन') के बाद से यह देर से स्थिर बाध्यकारी है। लेकिन मेरा उत्पादन सर्वर PHP 5.2.11 चलाता है और इसलिए मुझे अपनी स्क्रिप्ट को अनुकूलित करने की आवश्यकता है।

क्या इस मुद्दे को हल करने के लिए कुछ हद तक कामकाज है?

चीयर्स!
क्रिस्टोफ़र

संपादित करें: लक्ष्य

के रूप में नीचे वर्णित है, यह मैं क्या हासिल करने की कोशिश कर रहा हूँ की एक बहुत सरलीकृत उदाहरण है। यदि मैं आपको दो विकल्पों के साथ प्रदान करता हूं, तो मैंने अपनी समस्या को हल करने के लिए उपयोग किया है (और समस्या स्वयं) किसी के पास मुझसे अलग समाधान हो सकता है ...

मैंने एक बेस डेटाबेस मॉडल बनाया है जिसमें "ढूंढें" , "find_by" और "find_all" (सभी स्थिर)।

PHP 5.3 में get_called_class() नामक एक फ़ंक्शन है जिसका उपयोग मैं वर्तमान में कक्षा के नाम को निर्धारित करने के लिए उपयोग करता हूं, और उसके बाद सही डेटाबेस तालिका के विरुद्ध मानचित्र बनाने के लिए इसका उपयोग करता हूं। पूर्व श्रेणी Userusers पर इंगित करेगी।

get_called_class() PHP 5.2.x में मौजूद नहीं है और मैंने पाया हैक कार्यान्वयन बहुत अविश्वसनीय हैं। फिर मैं कक्षा मॉडल वाले सभी मॉडल वर्गों में स्थिर चर का उपयोग करने के इस विकल्प को बदल गया।

+1

मुझे लगता है '' Dog' Animal' का विस्तार करना चाहिए? –

+0

आप बिल्कुल सही हैं :) – Christoffer

+1

आगे बताते हुए, मुझे लगता है कि आपको पंक्ति वर्ग पर स्टेटिक्स की बजाय टेबल क्लास पर विधियों के रूप में कार्यों को ढूंढना/ढूंढना चाहिए (जो आपको लगता है कि आप – gnarf

उत्तर

2

अफसोस की बात है कि PHP 5.3 से पहले देर से स्थिर बाध्यकारी अनुकरण करने का कोई तरीका नहीं है। जब आप इरादा रखते हैं तो विरासत को काम करने का एकमात्र तरीका यह है कि यदि वे आवृत्ति चर और विधियां हैं।

+0

जिसका अर्थ है कि मैं ऑब्जेक्ट्स बनाने के लिए स्थिर तरीकों का उपयोग नहीं कर सकता? – Christoffer

+1

यदि आप संग्रहीत स्थिर डेटा पर भरोसा नहीं कर रहे हैं उपclasses में, संख्या – VoteyDisciple

9

ज़ेंड फ्रेमवर्क में कुछ सबक्लासिंग करते समय मैं इस समस्या में भाग गया। मेरे दृढ़ संकल्प था कि विशुद्ध रूप से स्थिर देश में, आप केवल एक विकल्प होता है ... इनहेरीट कक्षा में समारोह को पुन: निर्धारित:

class Animal { 
    public static $color = 'black'; 

    public static function get_color() 
    { 
     return self::$color; 
    } 
} 

class Dog extends Animal { 
    public static $color = 'brown'; 

    public static function get_color() 
    { 
     return self::$color; 
    } 
} 

आप उदाहरण बना सकते हैं, तो - आप get_class($this) उपयोग कर सकते हैं बुला वर्ग पता लगाने के लिए उदाहरण के लिए:

class Animal { 
    public static $color = 'black'; 

    public function getColor() // note, not static 
    { 
     $class = get_class($this); 
     return $class::$color; 
    } 
} 

class Dog extends Animal { 
    public static $color = 'brown'; 
} 

$animal = new Animal(); 
echo $animal->getColor(); // prints 'black' 
$dog = new Dog(); 
echo $dog->getColor(); // prints 'brown' 

केवल अन्य विकल्प मैं के स्थिर कार्य करने के लिए एक समारोह पैरामीटर का उपयोग किया गया था एक वर्ग इसे से बुलाया जा रहा था को परिभाषित करने के बारे में सोचा। यह __CLASS__ पर डिफ़ॉल्ट हो सकता है और फिर आप सबक्लास से return parent::get_class($class) कर सकते हैं।

class Animal { 
    public static $color = 'black'; 

    public static function get_color($class = __CLASS__) 
    { 
     // Super Simple Example Case... I imagine this function to be more complicated 
     return $class::$color; 
    } 
} 

class Dog extends Animal { 
    public static $color = 'brown'; 

    public static function get_color($class = __CLASS__) 
    { 
     return parent::get_color($class); 
    } 
} 
+1

आपके उत्तर के लिए धन्यवाद। यह मेरे द्वारा प्रदान किए गए उदाहरण में काम करता है, लेकिन वास्तविक मामला काफी जटिल है। मैं आपको यह बताने के लिए अपनी पोस्ट संपादित करता हूं कि मैं वास्तव में क्या करना चाहता हूं और उम्मीद है कि बहुत कुछ हो सकता है मैंने कोशिश की तुलना में अलग कोण। – Christoffer

5

PHP में: इस तरह के पैटर्न स्थिर समारोह पुनः उपयोग आसान (के रूप में मैं एक सार्वजनिक स्थिर संपत्ति लौटने शक केवल एक चीज आपको लगता है कि स्थिर विधि में के लिए self:: उपयोग करने के लिए कोशिश कर रहे हैं बनाने के लिए इस्तेमाल किया जा सकता 5।3 +, निम्नलिखित को प्राथमिकता दी जाएगी:

class Animal { 
    public static $color = 'black'; 

    public static function get_color() 
    { 
     return static::$color; // Here comes Late Static Bindings 
    } 
} 

class Dog extends Animal { 
    public static $color = 'brown'; 
} 

echo Animal::get_color(); // prints 'black' 
echo Dog::get_color(); // prints 'brown' 

Late Static Bindings (PHP.net)

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