हाँ, यह संभव है। खैर, माता-पिता सभी संभावित बाल विधियों को नहीं जान सकते हैं, लेकिन जान सकते हैं कि __call
magic 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
वर्ग के रूप में यह बहुत सामान्य है और बाद में एक जीवित नरक डिबगिंग कर देगा नहीं पकड़ ("क्यों इस विधि एक सरणी लौटा रहा है ?? ")
इस स्थिति में, मैं एक वैश्विक घटना तैयार करूंगा और फिर इसे सुन सकता हूं, अगर किसी भी * बाल वर्ग में कोई अपवाद फेंक दिया गया है। बस कहा, जब भी कोई अपवाद "किसी भी बच्चे में" फेंक दिया जाता है, तो आपको माता-पिता वर्ग को सिग्नल भेजना पड़ता है। –
सच @ वर्ल एकार लेकिन क्या होगा यदि यह एक ओवरराइड विधि है। क्या यह वही है। बस उत्सुक – Akintunde007
@ अकिंटुन्डे, सही और यही कारण है कि मैंने * किसी * बच्चे को कहा, क्योंकि आपको ओवरराइड करने में सक्षम होने के लिए उत्तराधिकारी होना है। तो आपके पास एक बच्चा वर्ग होगा, जो अपवाद फेंकता है और आपको उस विधि में एक सिग्नल आग लगाना होगा। –