2010-06-15 24 views
13

पर कॉल करने से पहले एक ओवरराइड पैरेंट विधि मौजूद है या नहीं, मैं यह सुनिश्चित करने के लिए कैसे जाउंगा कि ओवरराइड पैरेंट विधि इसे कॉल करने से पहले मौजूद है?यह जांच कर रहा है कि

public function func() { 
    if (function_exists('parent::func')) { 
     return parent::func(); 
    } 
} 

हालांकि function_exists सच करने के लिए कभी नहीं का मूल्यांकन करता है:
मैं इस कोशिश की है।

उत्तर

3

मैं इस जाँच नहीं की है, लेकिन है सही समारोह method_exists:

http://php.net/manual/en/function.method-exists.php

+1

method_exists हालांकि माता पिता के साथ काम नहीं करता है, धन्यवाद। किसी कारण से मुझे पहले काम करने के लिए function_exists प्राप्त करना याद है, लेकिन अब यह नहीं है ... –

+5

उस स्थिति में, मुझे यकीन नहीं है कि आप क्या करने का प्रयास कर रहे हैं। शायद आप इसे get_parent क्लास के साथ जोड़ सकते हैं - इस तरह कुछ: method_exists (get_parent_class ($ this), 'func') हालांकि मैं गलत पेड़ को भड़क रहा हूं। – Mike

+0

आह, वास्तव में काम करता है ... एक बार। इसे पहले माता-पिता के बाद किसी भी उच्चतम जाने के लिए लूप की आवश्यकता होती है। –

0
<?php 
class super { 
    public function m() {} 
} 

class sub extends super { 
    public function m() { 
     $rc = new ReflectionClass(__CLASS__); 
     $namepc = $rc->getParentClass()->name; 
     return method_exists($namepc, __FUNCTION__); 
    } 
} 

$s = new sub; 
var_dump($s->m()); 

bool(true) देता है। यह सुनिश्चित नहीं है कि यह विधि काम करेगी यदि विधि super के सुपरक्लास में परिभाषित की गई थी, लेकिन यह एक साधारण लूप पेश करने की बात होगी।

+0

माइक की get_parent_class विधि प्रतिबिंब के बिना, वही चीज़ पूरी करती है। –

21
public function func() 
{ 
    if (is_callable('parent::func')) { 
     parent::func(); 
    } 
} 

यदि मैं मौजूद है तो माता-पिता कन्स्ट्रक्टर को कॉल करने के लिए इसका उपयोग करता हूं, ठीक काम करता है।

मैं भी एक सामान्य संस्करण के रूप में निम्नलिखित का उपयोग करें:

public static function callParentMethod(
    $object, 
    $class, 
    $methodName, 
    array $args = [] 
) { 
    $parentClass = get_parent_class($class); 
    while ($parentClass) { 
     if (method_exists($parentClass, $methodName)) { 
      $parentMethod = new \ReflectionMethod($parentClass, $methodName); 
      return $parentMethod->invokeArgs($object, $args); 
     } 
     $parentClass = get_parent_class($parentClass); 
    } 
} 

इस तरह इसका इस्तेमाल:

callParentMethod($this, __CLASS__, __FUNCTION__, func_get_args()); 
+1

'if (is_callable ('parent :: func')) parent :: func(); 'समाधान बहुत अच्छा है, यदि सी बी और बी बढ़ाता है तो ए और सी :: फू चेक को अभिभावक :: बार और बार घोषित किया जाता है ए में लेकिन बी में नहीं, यह अभी भी उम्मीद के अनुसार काम करता है। – Logikos

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