2010-06-15 11 views

cevap

3

Doğru fonksiyonu method_exists bu kontrol ettim, ama değil ettik:?

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

+1

method_exists olsa ebeveyni ile teşekkür çalışmaz. Bazı nedenlerden ötürü function_exists'in daha önce çalışmasını hatırlıyorum, ama şimdi değil ... –

+5

Bu durumda, ne yapmaya çalıştığınızdan emin değilim. Belki de get_parent sınıfıyla birleştirebilirsiniz - bunun gibi bir şey: method_exists (get_parent_class ($ this), 'func') Yanlış ağacın havlamasına neden olabilirim. – Mike

+0

Ah, aslında bir kez çalışıyor. İlk ebeveynden daha yüksek gitmek için dönmesi gerekiyor. –

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) verir. Yöntem, super bir üst sınıfta tanımlanmışsa, bunun işe yarayıp yaramayacağından emin değilsiniz, ancak basit bir döngü oluşturmanın önemi olacaktır.

+0

Mike'ın get_parent_class yöntemi, Yansıma olmadan aynı şeyi gerçekleştirir. –

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

Varsa ana kurucuyu aramak için bunu kullanıyorum, iyi çalışıyor.

Ben de genel bir versiyonu olarak aşağıdaki kullanın:

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); 
    } 
} 

bu gibi kullanmak:

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

the if (is_callable ('parent :: func')) parent :: func(); 'C, B ve B, A ve C'yi genişletirse çözüm harikadur. :: Üst ve alt için :: Foo denetimleri Bar ve Bar bildirilir A'da ama B'de değil, hala beklendiği gibi çalışıyor. – Logikos

İlgili konular