2009-09-25 15 views
11

मैं नियमित रूप से एक कक्षा बनाता हूं जिसमें कुछ निजी चर होते हैं। जब इस वर्ग का एक उदाहरण सेट किया गया है, तो कक्षा के सभी चरों को गेटर्स और सेटर्स के साथ भरना संभव होना चाहिए।PHP में कक्षा के लिए गेटर्स और सेटर्स उत्पन्न करने का सबसे अच्छा तरीका क्या है?

क्या कक्षा के निर्माण पर प्रत्येक चर के लिए इन सभी सेटर्स और गेटर्स टाइप किए बिना ऐसा करने का कोई आसान तरीका है?

अब मैं वर्ग

public function setVar($var){ 
$this->var = $var; 
} 

और

public function getVar(){ 
return $this->var; 
} 

अब हम रेगुलर एक्सप्रेशन का उपयोग में प्रत्येक वर के लिए यह लिखने की आवश्यकता नहीं है, लेकिन अगर यह सबसे आसान तरीका है मुझे पता नहीं .. हम एक्लिप्स को पर्यावरण के रूप में उपयोग करते हैं, तो शायद कुछ उपयोगी प्लगइन हैं?

+0

हालांकि दर्द, हालांकि इन्हें लागू करने में शायद ही अधिक समय लगता है। मैं आमतौर पर एम करता हूं जबकि मैं अपना दोपहर का भोजन खा रहा हूं। बेहतर अभी तक, – Chris

+0

@Chris को किसी अन्य व्यक्ति को पास करने के लिए कोड को पास करें, इसे किसी अन्य को पास नहीं किया जा सकता है। एक छात्र या ऐड-इन शायद इसके लिए एक उचित समाधान भी लेना चाहता है ... – Kennethvr

उत्तर

33

ग्रहण के साथ प्राथमिकताएं पर जाएं -> पीएचपी -> संपादक -> टेम्पलेट -> नई और कुछ इस तरह का उपयोग करें:

private $$${PropertyName}; 
${cursor}  
public function get${PropertyName}() 
{ 
    return $$this->${PropertyName}; 
} 

public function set${PropertyName}($$value) 
{ 
    $$this->${PropertyName} = $$value; 
} 

टेम्पलेट टाइप यह का नाम और Ctrl + स्थान का उपयोग करने के लिए - एक संदर्भ मेनू चाहिए जब आप नाम टाइप करते हैं तो स्वचालित रूप से प्रकट होते हैं।

+0

कॉल करना चाहता हूं इन गुणों में ऊंट केस उपयोग से संबंधित कोई भी फ़िक्स? – porfiriopartida

+0

@porfiriopartida मैंने एक ही चीज़ के बारे में सोचा और प्राप्त और सेट में एक अलग चर का उपयोग कर समाप्त हो गया। टेम्पलेट का उपयोग करते समय, आपको केवल संपत्ति और गेटटर फ़ंक्शन सेट करना होगा। ;-) – andreas

2

क्या आपने __set और __get विधियों को देखा है? यह नहीं पता कि यह आपका क्या मतलब है लेकिन जब भी कक्षा सदस्य एसईटी या पुनर्प्राप्त/प्राप्त/एक्सेस किया जाता है तो स्वचालित रूप से कॉल किया जाता है।

0

शायद बेहतर sollution:

class base { 

    protected $_vars = array(); 


    public function setVar($name, $value = null) { 
     $this->_vars[$name] = $value; 
    } 

    public function getVar($name) { 
     return isset($this->_vars[$name]) ? $this->_vars[$name] : null; 
    } 
} 

और बस इस वर्ग का विस्तार। या आप __set और __get विधियों का भी उपयोग कर सकते हैं, लेकिन वे काफी धीमे हैं।

+0

यह एक अच्छा समाधान हो सकता है, लेकिन क्या यह एक अच्छा विचार है कि सभी को एक सरणी में रखा जाए, न कि सभी अलग-अलग युद्धों के रूप में? या इससे कोई फर्क नहीं पड़ता? – Kennethvr

+1

यदि यह डेटा काम कर रहा है (जैसे सरणी, तार, इत्यादि) यह ठीक है। लेकिन अगर आप डेटाबेस ऑब्जेक्ट या अन्य जैसे कुछ ऑब्जेक्ट्स सेट करना चाहते हैं, तो आपको ऐसा नहीं करना चाहिए। फिर रचनाकारों या अन्य तरीकों का उपयोग करें। – Pawka

+0

क्या आप निश्चित रूप से __set और __get mehods धीमे होने के बारे में निश्चित हैं ?? – andho

1

ज़ेंड स्टूडियो में स्वचालित गेटर/सेटर पीढ़ी की सुविधा है।

1

मुझे लगता है कि कुछ स्ट्रिंग फ़ंक्शंस के साथ __set और __get का उपयोग करने का सबसे अच्छा तरीका है, यहां मुझे आपको दिखाएं।

class UserProfile 
{ 
    public function __get($key) 
    { 
     if(isset($this->$key)) 
     { 
      return $this->$key; 
     } 
    } 

    public function __set($key,$val) 
    { 
     $this->cahnge($key,$val); 
    } 

    public function __call($key,$params) 
    { 
     if(substr("set",$key)) 
     { 
      //Update 
     }elseif(substr("get",$key)) 
     { 
      //return 
     } 

     //Else Blah 
    } 

    private function change($key,$val) 
    { 
     if(isset($this->$key)) 
     { 
      $this->$key = $val; 
     } 
    } 
} 

__call() विधि आप जब तक इस तरह के

$profile->setUsername('Robert Pitt'); के रूप में कार्य के साथ सेट करने की अनुमति देगा के रूप में आप substr सेट/हो और वर्ग के एक मूल्य के रूप में स्ट्रिंग के बाकी के लिए जाँच:)

एक और उदाहरण

public function __call($method,$params = array()) 
{ 

    if(isset($params[0]) && is_string($params[0])) 
    { 
     $this->$method = $params[0]; 
    } 
} 

//.... 

$profile->username('Robert Pitt'); 

थेरेस अधिक काम यहाँ किया जाना

,210
+0

क्या आप वाकई यह काम करते हैं? मैं इसे प्रबंधित नहीं कर सका। क्या यह किसी प्रकार का PHP जादू है? मैं '$ प्रोफाइल-> __get (उपयोगकर्ता नाम) 'पर कॉल कर सकता हूं लेकिन मैं' $ प्रोफ़ाइल-> getUsername() ' – azerafati

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