2011-01-17 13 views
46

मैं इस मामले के साथ थोड़ा उलझन में हूँ। मैं एक ओआरएम कक्षा तैयार कर रहा हूं जो रेलवे पर रूबी में ActiveRecord के समान व्यवहार करने की कोशिश करता है, लेकिन यह बिंदु के बगल में है।PHP स्थिर हो सकता है :: स्वयं को प्रतिस्थापित करें ::?

जो मैं कहने की कोशिश कर रहा हूं वह यह है कि मेरी कक्षा स्थिर विशेषता विरासत का व्यापक उपयोग करती है, खासकर डेटाबेस और टेबल हैंडलिंग के लिए। मेरा सवाल है, क्या मुझे स्वयं का उपयोग करना चाहिए :: बिल्कुल?

+0

मुझे लगता है कि 'स्थैतिक' पहली जगह गलत दृष्टिकोण है। ऐसा लगता है (और गलत होने पर सही करें) आपने अभी अपना कोड अवांछनीय बना दिया है। – PeeHaa

उत्तर

94

आपको खुद से पूछना है: "क्या मैं पर्याप्त दृष्टिकोण के साथ समस्या को लक्षित कर रहा हूं?"

self:: और static:: दो अलग-अलग चीजें करते हैं। उदाहरण के लिए self:: या __CLASS__ वर्तमान वर्ग के संदर्भ हैं, इसलिए कुछ दायरे में परिभाषित यह आगे स्थिर कॉलिंग की आवश्यकता को पूरा नहीं करेगा।

विरासत पर क्या होगा?

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     self::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 

B::test(); 

यह static:: साथ दूसरी ओर में

A 

प्रिंट यह अपेक्षित व्यवहार

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     static::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 


B::test(); 

है जाएगा यह प्रिंट होगा

B 

कहा जाता है कि। यह उस कक्षा को कॉल करने की सीमा को हल करता है जो रनटाइम पर संदर्भित था।

इस बात को ध्यान में रखते हुए मुझे लगता है कि अब आप समस्या को पर्याप्त रूप से देख और हल कर सकते हैं। यदि आप कई स्थिर सदस्यों को विरासत में ले रहे हैं और माता-पिता और बच्चों के सदस्यों की पहुंच की आवश्यकता है self:: पर्याप्त नहीं होगा।

+8

तो मूल रूप से यदि मैं चीजों को सामान्य की तरह व्यवहार करना चाहता हूं, जैसे कि हर दूसरी भाषा में, मुझे इसके बजाय स्थिर का उपयोग करना चाहिए? और फिर जब ऐसी चीजें वास्तव में कोई फर्क नहीं पड़ती हैं तो मैं भी अनुकूलता के लिए स्वयं का उपयोग कर सकता हूं। क्या वो सही है? – elite5472

+7

यह सही है, अगर आप पिछड़े संगतता चाहते हैं तो आपको स्वयं से निपटना होगा। यदि आप स्थैतिक सदस्यों तक पहुंचना चाहते हैं तो आपको सदस्यों को लपेटने वाली एक स्थिर विधि करना होगा। – DarkThrone

+0

ठीक है, मेरे लिए चीजों को साफ़ करने के लिए धन्यवाद। – elite5472

6

कोशिश bellow कोड का उपयोग करने स्वयं और के बीच अंतर स्थिर देखने के लिए:

<?php 
class Parent_{ 
    protected static $x = "parent"; 
    public static function makeTest(){ 
     echo "self => ".self::$x."<br>"; 
     echo "static => ".static::$x;  
    } 
} 

class Child_ extends Parent_{ 
    protected static $x = "child"; 
} 

echo "<h4>using the Parent_ class</h4>"; 
Parent_::makeTest(); 

echo "<br><h4>using the Child_ class</h4>"; 
Child_::makeTest(); 
?> 

और आप इस परिणाम मिलता है: Parent_ वर्ग

का उपयोग कर

  • स्व => माता पिता
  • स्थिर => माता पिता

का उपयोग कर Child_ वर्ग

  • स्वयं => माता पिता
  • स्थिर => बच्चे
संबंधित मुद्दे