2009-04-28 14 views
6

के अंदर __set विधि को अनदेखा कर रहा है PHP मैं कई इनपुट सत्यापन के साथ एक कक्षा बना रहा हूं, और मैंने उन्हें __set विधि के अंदर रखने का निर्णय लिया है (मुझे यकीन नहीं है कि यह उचित रूप है क्योंकि मेरे पास सीमित है ओओपी अनुभव)। ऐसा लगता है कि वर्ग के बाहर से अमान्य मूल्य पारित होने पर उचित त्रुटियों को फेंकना ठीक लगता है। हालांकि, यदि वर्ग के अंदर एक चर संशोधित किया गया है तो _ _set विधि को पूरी तरह से अनदेखा किया जा रहा है।कक्षा

किसी भी अंतर्दृष्टि बेहद सराहना की जाएगी

//RESULT::::::::::::::::::::::::::::::: 
// PASS: Testing : hello 
// PASS: Testing exception handling 
// __SET: Setting b to 123 
// PASS: Testing with valid value: 123 
// FAIL: Testing exception handling World2 



<?php 
class Test { 
     public $a; 
     private $b; 

     function __set($key, $val) { 

       switch($key) { 
         case 'b': 
           if(!is_numeric($val)) throw new Exception("Variable $b must be numeric"); 
           break; 
       } 

       echo ("__SET: Setting {$key} to {$val}<br/>"); 
       $this->$key = $val; 
     } 
     function __get($key) { return $this->$key; } 
     function bMethod() { 
       $this->b = "World2"; 
     } 

} 

$t = new Test(); 

//testing a 
try { 
     $t->a = "hello"; 
     echo "PASS: Testing $a: {$t->a}<br/>"; 
} catch(Exception $e) { 
     echo "FAIL: Testing $a"; 
} 

//testing b 
try { 
     $t->b = "world";  
     echo "FAIL: Testing $b exception handling<br/>"; 
} catch(Exception $e){ 
     echo "PASS: Testing $b exception handling<br/>"; 
} 

//testing b with valid value 
try { 
     $t->b = 123; 
     echo "PASS: Testing $b with valid value: {$t->b}<br/>"; 
} catch(Exception $e) { 
     echo "FAIL: Testing $b"; 
} 

//bypassing exception handling with method 
try { 
     $t->bMethod("world"); 
     echo "FAIL: Testing $b exception handling {$t->b}<br/>"; 
} catch(Exception $e) { 
     echo "PASS: Testing $b exception handling<br/>"; 
} 
+0

यह मैं कम से कम एक घंटे के लिए ढकोसला किया था ... – Jonathan

उत्तर

10

__set की परिभाषा पढ़ें: "। __set() जब दुर्गम सदस्यों के लिए डेटा लेखन चलाया जाता है" अप्राप्य यहां कुंजी है। कक्षा के भीतर से, सभी सदस्य सुलभ हैं और __set को छोड़ दिया गया है। Overloading

+0

दुर्भाग्य से मैं आज वोट से बाहर हूँ, लेकिन यह सही है। मैं इस मुद्दे में अन्य भाषाओं से गेटर्स/सेटर्स का अनुकरण करने की कोशिश कर रहा था। यह सिर्फ वही काम नहीं करता है। – zombat

6

प्रलेखन php documentation में कहते हैं:

__get() दुर्गम सदस्यों से डाटा पढ़ने में उपयोग किया जाता है।

तो, आप कुछ की तरह कर सकते हैं:

<?php 
class Test { 
    private $_params = array(); 

    function __set($key, $val) { 
     ... 
     $this->_params[$key] = $val; 
    } 

    function __get($key) { 
     if (isset($this->_params[$key])) return $this->$key; 
     throw Exception("Variable not set"); 
    } 

    ... 
} 
+0

यह एक हैक की तरह लगता है, लेकिन वास्तव में यह वही करता है जो मैं करना चाहता था; क्लास विधियों के अंदर परिवर्तनीय कॉल वेरिएबल्स को सीधे कॉल नहीं कर सकते हैं, इसलिए वे __set और __get फ़ंक्शन का उपयोग करते हैं। धन्यवाद! – thatcanadian