2009-02-13 5 views
8

मैं वर्तमान में मेरे पीएचपी वर्ग चर इस तरह निर्धारित किया है अप:PHP में कक्षा चर स्टोर करने का सबसे अच्छा तरीका क्या है?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

लेकिन मैं यह भी एक सारिणी का उपयोग करते हुए सभी चर स्टोर करने के लिए लोगों को देखा है:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

आप का उपयोग कौन करते हैं, और क्यों? हर एक के फायदे और नुकसान क्या हैं?

उत्तर

11

आम तौर पर, पहले लोगों ने पहले ही यहां बताए गए कारणों के लिए बेहतर है।

हालांकि, यदि आपको किसी वर्ग पर डेटा को निजी रूप से स्टोर करने की आवश्यकता है, लेकिन डेटा सदस्यों का पदचिह्न अज्ञात है, तो आप अक्सर अपने दूसरे उदाहरण को __get() __set() हुक के साथ जोड़कर देखेंगे कि वे हैं निजी रूप से संग्रहीत।

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

फिर, इस वर्ग की वस्तुओं stdClass का एक उदाहरण की तरह इस्तेमाल किया जा सकता है, के सदस्यों को आप सेट का केवल कोई भी वास्तव में सार्वजनिक

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

इस तकनीक को अपने उपयोग करता है कर रहे हैं, लेकिन वह __get बारे में पता होना() और __set() सार्वजनिक संपत्तियों को सीधे सेट करने से 10-12 गुना धीमी गति के क्रम में हैं।

6

यदि आप private $data; का उपयोग कर रहे हैं तो आपको अभी डेटा का एक अभेद्य ब्लॉब मिला है ... स्पष्ट रूप से बताते हुए कि यदि आप यह समझ रहे हैं कि कक्षा कैसे काम करती है तो उन्हें आपकी जिंदगी बहुत आसान हो जाएगी।

एक और विचार यह है कि यदि आप स्वत: पूर्ण के साथ एक आईडीई का उपयोग करते हैं - जो कि दूसरी विधि के साथ काम नहीं करेगा।

1

यदि कोड दोहराया गया है, तो सरणी और (foreach) neaten चीजें loops। आपको यह तय करने की ज़रूरत है कि आपके कोड में "पशु" अवधारणा दोहराई गई है या नहीं, या यदि कोड को प्रत्येक सदस्य की विशिष्टता में खोदने की आवश्यकता है।

यदि मुझे अपने आप को एक से अधिक बार दोहराना है, तो मैं लूप करता हूं।

0

मैं पहली विधि पसंद करते हैं, कुछ कारणों से:

एक अच्छा आईडीई में, वर्ग गुण दिखाई, यहां तक ​​कि निजी यदि/संरक्षित यह देखने के लिए कि क्या पहले से ही परिभाषित किया गया है आसान है, संभावना है कि आपको कम करने एक ही जानकारी दो बार स्टोर करें। यदि प्रोवर्बियल बस आपको घर के रास्ते पर हिट करती है, तो दूसरे डेवलपर के आने और आपके कोड को पढ़ने के लिए यह बहुत आसान है। और जब यह निजी var पर लागू नहीं होता है, यह कक्षाओं को संरक्षित करता है, इस वर्ग को बढ़ाने वाले वर्गों में, आपको वास्तव में शुद्ध पठनीयता के लिए दूसरी विधि से बचने की कोशिश करनी चाहिए।

इसके अलावा, एक साइड नोट के रूप में, मैं लगभग हमेशा निजी पर सुरक्षित चुनता हूं जब तक कि मेरे पास इसे निजी बनाने का एक बहुत ही विशिष्ट कारण न हो।

एकमात्र समय मैं शायद दूसरी विधि का उपयोग करता था, अगर मैं एक तरह की चीज़ों का संग्रह संग्रहीत कर रहा था।

1
  • पहली विधि का उपयोग करें जब आपको पता है कि आपको उस चर की आवश्यकता है।
  • गतिशील परिवर्तनीय आवश्यकताओं के दौरान दूसरी विधि (चर के एक सरणी संग्रह) का उपयोग करें।

आप इन 2 विधियों को जोड़ सकते हैं, इसलिए कुछ चर आपके वर्ग में हार्डकोड किए जाते हैं, जबकि अन्य गतिशील होते हैं। हार्डकोडेड वैरिएबल में जादू विधियों की तुलना में वरीयता होगी।