2013-06-21 9 views
16

इस पर एक त्रुटि फेंक एक त्रुटि फेंक देगा:बल पीएचपी अपरिभाषित संपत्ति

class foo 
{ 
    var $bar; 

    public function getBar() 
    { 
     return $this->Bar; // beware of capital 'B': "Fatal: unknown property". 
    } 

} 

लेकिन यह ऐसा नहीं करेंगे:

class foo 
{ 
    var $bar; 

    public function setBar($val) 
    { 
     $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar" 
    } 

} 

मैं कैसे दोनों ही मामलों में त्रुटियों फेंक पीएचपी मजबूर कर सकते हैं? मैं दूसरे मामले को पहले की तुलना में अधिक महत्वपूर्ण मानता हूं (क्योंकि मुझे एक संपत्ति में डी .... नेड टाइपो खोजने के लिए 2 घंटे लग गए थे)।

+1

यदि 'Bar' के माध्यम से' isset' –

+0

परिभाषित किया गया है आप की जांच कर सकता है और क्या अगर यह नहीं है के अनुसार त्रुटि स्तर सेट कर सकते हैं? मुझे अभी भी पता नहीं है कि कक्षा में 'बार' परिभाषित नहीं है। –

+0

खैर, कैमलकेस या लोअरकेस (या कुछ अन्य सम्मेलन) चुनें और फिर इसके साथ चिपके रहें। आप इसे लागू करने के लिए [PHP CodeSniffer ('phpcs')] (http://pear.php.net/package/PHP_CodeSniffer/redirected) जैसे कुछ उपयोग कर सकते हैं। साथ ही, गलत परिवर्तनीय नाम आपको एक पूरी तरह से समझने योग्य त्रुटि संदेश देंगे, जिसका उपयोग आप तुरंत पता लगाने के लिए कर सकते हैं कि त्रुटि कहां हुई। जादू विधियों का उपयोग '__get' और' __set' समस्या को हल कर सकता है, लेकिन किस कीमत पर? यह कोड को धीमा कर देगा, और यह समस्याओं के एक और सेट को जन्म दे सकता है। –

उत्तर

14

आप उपयोग कर सकते हैं जादू तरीकों

__set() is run when writing data to inaccessible properties.

__get() is utilized for reading data from inaccessible properties.

class foo 
{ 
    var $bar; 

    public function setBar($val) 
    { 
     $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar" 
    } 

    public function __set($var, $val) 
    { 
    trigger_error("Property $var doesn't exists and cannot be set.", E_USER_ERROR); 
    } 

    public function __get($var) 
    { 
    trigger_error("Property $var doesn't exists and cannot be get.", E_USER_ERROR); 
    } 

} 

$obj = new foo(); 
$obj->setBar('a'); 

यह त्रुटि

डाली जाएगी

Fatal error: Property Bar doesn't exists and cannot be set. on line 13

आप PHP error levels

+0

काम करना, लेकिन जो मैं खोज रहा हूं, वास्तव में: दोनों उत्तरों को कक्षा में कोड जोड़ने की आवश्यकता है त्रुटियों के लिए प्रोग्रामेटिक रूप से वाक्यविन्यास की जांच करने के लिए। आपको इसे सभी वर्गों (या कहीं से विरासत में) जोड़ने की ज़रूरत है, न कि सुरुचिपूर्ण तरीके से। कभी भी कम नहीं: अपवॉट, मैं इस –

+0

पर विचार करूंगा कोई दूसरा रास्ता नहीं है;/आप हमेशा इसे अमूर्त वर्ग से प्राप्त कर सकते हैं या लक्षणों का उपयोग कर सकते हैं, मुझे ऐसा कुछ भी नहीं दिख रहा है जो इसमें सुरुचिपूर्ण नहीं है। – Robert

+0

समझ गया। मैं अभी भी इसे "सुरुचिपूर्ण" के रूप में नहीं मानता, लेकिन यह कोशिश करने लायक है (और PHP से संबंधित है और आपके उत्तर में नहीं!) –

10

एक समाधान मैं कल्पना कर सकते हैं हो सकता है (ab) __set और शायद property_exists का उपयोग कर:

public function __set($var, $value) { 
    if (!property_exists($this, $var)) { 
     throw new Exception('Undefined property "'.$var.'" should be set to "'.$value.'"'); 
    } 
    throw new Exception('Trying to set protected/private property "'.$var.'" to "'.$value.'" from invalid context'); 
} 

डेमो: http://codepad.org/T5X6QKCI

+0

+1 वही तरीका करेगा – leuchtdiode

+1

आप थोड़ा तेज़ थे :) बीक्यूज मैंने त्रुटियों के साथ अधिक जटिल उदाहरण लिखा है अपवाद नहीं – Robert

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