2011-09-06 18 views
10

मुझे एक अपरिवर्तनीय कक्षा बनाने की आवश्यकता है जो कि केवल एक सदस्य फ़ील्ड कंटेनर है। मैं चाहता हूं कि इसके क्षेत्र अपने कन्स्ट्रक्टर में एक बार तत्काल हो जाएं (मान को कन्स्ट्रक्टर के पैरामीटर के रूप में दिया जाना चाहिए)। मैं चाहता हूं कि खेतों में सार्वजनिक हो लेकिन अपरिवर्तनीय हो। मैं प्रत्येक फ़ील्ड से पहले final कीवर्ड का उपयोग कर जावा के साथ ऐसा कर सकता था। यह PHP में कैसे किया जाता है?PHP: अपरिवर्तनीय सार्वजनिक सदस्य फ़ील्ड

+3

यह PHP में संभव नहीं है। – Sjoerd

+0

फ़ील्ड सार्वजनिक क्यों होनी चाहिए? – Pete171

+0

@ pete171 शायद इसलिए वे केवल पढ़ने के लिए – fbstj

उत्तर

16

के dinamyc गिनती आप __set और __get जादू तरीकों का उपयोग और के रूप में है कि संपत्ति की घोषणा करनी चाहिए संरक्षित या निजी:

class Example 
{ 
    private $value; 

    public function __construct() 
    { 
     $this->value = "test"; 
    } 

    public function __get($key) 
    { 
     if (property_exists($this, $key)) { 
      return $this->{$key}; 
     } else { 
      return null; // or throw an exception 
     } 
    } 

    public function __set($key, $value) 
    { 
     return; // or throw an exception 
    } 
} 

उपयोग:

$example = new Example(); 
var_dump($example->value); 
$example->value = "invalid"; 
var_dump($example->value); 

आउटपुट:

string(4) "test" 
string(4) "test" 
2

आप __set() जादू विधि का उपयोग कर सकते हैं और कोई अपवाद फेंक सकता है जब कोई व्यक्ति सीधे संपत्ति सेट करने का प्रयास करता है।

class ClassName { 
    public function __set($key, $value) { 
     throw new Exception('Can't modify property directly.'); 
    } 
} 

हालांकि, यह संपत्तियों में संशोधन को रोक देगा चाहे वे सार्वजनिक हों या नहीं।

+0

यह देखते हुए कि संपत्तियों को निजी/वैसे भी संरक्षित है, जो कुछ भी उपयोगी नहीं जोड़ता है। दूसरी तरफ '__get()', हम यही चाहते हैं। – Mchl

+3

__set() अनावश्यक गुणों को डेटा लिखते समय चलाया जाता है। यह सार्वजनिक गुणों के लिए सार्वजनिक नहीं है – jbrond

2

magic methods

ताकि आप बेहतर कर सकते हैं - अगर आप क्षेत्रों

class ClassName { 
     private $fields = array(); 
     // use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12)); 
     // echo $cl->field_4; echo $cl->f; 
     public function __construct($data= array()) 
     { 
      if (!is_array($data) || !count($data)) throw new Exception('Not enough args') 
      foreach ($data as $key=>$val) 
      { 
       if (is_numeric($key)) 
       $this->fields['field_'.$key] = $val; 
       else 
       $this->fields[$key] = $val; 
      }  
     } 
      /* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1; 
     public function __construct() 
    { 
      $ata = funcs_get_args(); 

      if (!count($data)) throw new Exception('Not enough args') 
      foreach ($data as $key=>$val) 
      { 
       if (is_numeric($key)) 
       $this->fields['field_'.$key] = $val; 
       else 
       $this->fields[$key] = $val; 
      }  
    } 
    */ 
     public function __get($var) { 
      if (isset($this->fields[$var])) 
       return $this->fields[$var]; 
      return false; 
      //or throw new Exception ('Undeclared property'); 
     } 
    } 
+4

'__set' के साथ काम नहीं करता है – sanmai

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