2017-08-29 19 views
5

में फेंक दिया अपवाद संभाल मान लिया जाये कि मैं एक माता पिता के वर्ग के लिए:जेनेरिक विधि को पकड़ने और बच्चे कक्षाओं

class Parent { 

    //... 

} 

और एक बच्चे वर्ग के तरीकों के साथ:

class Child extends Parent { 

    public function foo() { 
     // process and return data 
    } 

    public function bar() { 
     // process and return data 
    } 

    // way more methods... 

} 

फिर वहाँ PHP में एक सामान्य तरीका है बाल विधियों में फेंकने वाले किसी भी अपवाद को संभालने के लिए? उदाहरण के लिए, अभिभावक वर्ग में एक हैंडलर? या क्या मुझे सभी विधियों को अलग-अलग प्रयास-पकड़ ब्लॉक में लपेटने की ज़रूरत है?

जो मैं प्राप्त करना चाहता हूं, वह खाली array() वापस लौटना है यदि कोई भी बच्चा किसी भी तरह का अपवाद फेंक देता है।

+1

इस स्थिति में, मैं एक वैश्विक घटना तैयार करूंगा और फिर इसे सुन सकता हूं, अगर किसी भी * बाल वर्ग में कोई अपवाद फेंक दिया गया है। बस कहा, जब भी कोई अपवाद "किसी भी बच्चे में" फेंक दिया जाता है, तो आपको माता-पिता वर्ग को सिग्नल भेजना पड़ता है। –

+0

सच @ वर्ल एकार लेकिन क्या होगा यदि यह एक ओवरराइड विधि है। क्या यह वही है। बस उत्सुक – Akintunde007

+1

@ अकिंटुन्डे, सही और यही कारण है कि मैंने * किसी * बच्चे को कहा, क्योंकि आपको ओवरराइड करने में सक्षम होने के लिए उत्तराधिकारी होना है। तो आपके पास एक बच्चा वर्ग होगा, जो अपवाद फेंकता है और आपको उस विधि में एक सिग्नल आग लगाना होगा। –

उत्तर

-1

मेरे व्यक्तिगत अनुभव से अनुकूलित अपवाद हैंडलर बनाएं और यदि आप अपवाद प्राप्त करते हैं तो खाली सरणी वापस करें। ये लिंक की मदद से आप अपवाद PHP में से निपटने को समझने के लिए: https://www.w3schools.com/php/php_exception.asp http://php.net/manual/en/language.exceptions.php

+1

मुझे यकीन है कि ओपी पूछ रहा है यह नहीं है .. – Naruto

+0

ओपी एक ऑब्जेक्ट उन्मुख तरीके से बात कर रहा है। यह – Akintunde007

+0

ओपी जानता है कि अपवादों को कैसे संभालना है, वह पूछ रहा है, अगर बच्चे वर्ग में फेंकने वाले मूल वर्ग में अपवादों को पकड़ना संभव है। –

1

हाँ, यह संभव है। खैर, माता-पिता सभी संभावित बाल विधियों को नहीं जान सकते हैं, लेकिन जान सकते हैं कि __callmagic method लागू करके एक अपरिभाषित विधि कहां से बुलाया जाता है।

हम गतिशील रूप से एक कोशिश-पकड़ "रैपर" बनाने के लिए इस विधि का उपयोग कर सकते हैं।

अपने माता पिता के लिए इस विधि जोड़ें:

public function __call($method, $args) 
{ 
    // If method call ends with 'Safe' 
    $isSafeMethod = substr($method, -strlen('Safe')) === 'Safe'; 

    if (!$isSafeMethod) { 
     trigger_error('Call to undefined method '.__CLASS__.'::'.$method.'()', E_USER_ERROR); 
     return null; 
    } 

    // Strip 'Safe' suffix from method name 
    $wrappedMethodName = substr($method, 0, strpos($method, 'Safe')); 

    try { 
     return $this->$wrappedMethodName($args); 
    } catch (Exception $e) { 
     return []; 
    } 
} 

अब भी, कभी भी आप इस कोशिश-पकड़ आवरण आह्वान करने के लिए चाहते हैं, बस संलग्न विधि नाम है कि आप रैप करने के लिए चाहते हैं "सुरक्षित"। पूर्ण कोड + उदाहरण:

class TestParent { 

    public function __call($method, $args) 
    { 
     // If method call ends with 'Safe' 
     $isSafeMethod = substr($method, -strlen('Safe')) === 'Safe'; 

     if (!$isSafeMethod) { 
      trigger_error('Call to undefined method '.__CLASS__.'::'.$method.'()', E_USER_ERROR); 
      return null; 
     } 

     // Strip 'Safe' suffix from method name 
     $wrappedMethodName = substr($method, 0, strpos($method, 'Safe')); 

     try { 
      return $this->$wrappedMethodName($args); 
     } catch (Exception $e) { 
      return []; 
     } 

    } 


} 

class TestChild extends TestParent { 

    public function throwingMethod() 
    { 
     throw new RuntimeException(); 
    } 

    public function succeedingMethod() 
    { 
     return 'Success'; 
    } 

} 

$child = new TestChild(); 

// With 'Safe' try-catch invoked in parent 
var_dump($child->throwingMethodSafe()); // Empty array 
var_dump($child->succeedingMethodSafe()); // 'Success' 

// Without 'Safe' try-catch 
var_dump($child->throwingMethod()); // throws RuntimeException as expected 

Output in 3v4l.org

Sidenote: कृपया Exception वर्ग के रूप में यह बहुत सामान्य है और बाद में एक जीवित नरक डिबगिंग कर देगा नहीं पकड़ ("क्यों इस विधि एक सरणी लौटा रहा है ?? ")

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