2010-06-22 7 views
8

PHP'de, bir bağımsız sınıftan call_user_func_array argümanını kullanarak yöntemleri çağırmak için bir yol var mı?PHP'de ebeveyn yöntemine erişmek için call_user_function öğesini kullanma

function childFunction($arg1, $arg2, $arg3 = null) { 
    // I do other things to override the parent here... 

    $args = func_get_args(); 
    call_user_func_array(array(parent, __FUNCTION__), $args); // how can I do this? 
} 

bu garip kesmek mi: Esasen, ben biraz daha az optimum süre beni böyle keyfi bir yönteme ebeveyn çağırmak izin verir, Demirbaş kodu o biraz yazmak istiyorum? Evet. Bu tür plakayı pek çok yerde kullanacağım, ancak yöntemin düzgün bir şekilde okunması konusunda hata olması muhtemeldir;

+0

Bunun gibi bir yapının hataya neden olması daha muhtemeldir çünkü 'call_user_func_array' ve arkadaşlar biraz büyülüdür. Bir şey bana daha iyi bir çözüm olduğunu söyler, ama sorun onu görmek için yeterince açık değil. – Kris

cevap

-1

Örneğin sınıfına daha fazla yüklenmediği sürece, bir üst sınıftaki herhangi bir yöntemi arayabilirsiniz.

ben iyi bir fikre

class MathStuff 
{ 
    public function multiply() 
    { 
     $total = 1; 
     $args = func_get_args(); 
     foreach($args as $order => $arg) 
     { 
      $total = $total * $arg; 
     } 
     return $total; 
    } 
} 
class DangerousCode extends MathStuff 
{ 
    public function multiply() 
    { 
     $args = func_get_args(); 

     $reflector = new ReflectionClass(get_class($this)); 
     $parent = $reflector->getParentClass(); 
     $method = $parent->getMethod('multiply'); 
     return $method->invokeArgs($this, $args); 
    } 
} 


$danger = new DangerousCode(); 
echo $danger->multiply(10, 20, 30, 40); 

olmasını inanmıyorum lütfen unutmayın: Sadece biraz daha gelişmiş büyü için $this->methodName(...)

kullanın burada istiyorum gibi görünüyor ne bir çalışma örneği Temel olarak, bu yöntem, yöntem arama tablosunda MathStuff::multiply yöntemini arar ve kodunu DangerousCode örneğinden örnek veriler üzerinde yürütür.

20

PHP sürümüne bağlı ... Ya

call_user_func_array(array($this, 'parent::' . __FUNCTION__), $args); 

bir veya

call_user_func_array(array('parent', __FUNCTION__), $args); 

deneyin. Daha eski olanlar biraz düşüyor, dikkat et :)

+1

[Bunların ikisi de PHP 5.3 + 'da çalışacaktır] (http://3v4l.org/sv4no). Ancak, daha eski sürümlerde (sisteminizi güncelleyin!), [1. 'func_get_args'ı bir değişkene ilk olarak ayarlayın (ve doğrudan' call_user_func_array (.., func_get_args()) 'olarak değil, ikincisi de sadece ilk örneği kullanabilirsiniz.] (http://3v4l.org/iCJ3e) – h2ooooooo

+0

İlk yöntem ('array ($ this, 'parent ::'. __FUNCTION __)'), 'call_user_func_array' öğesini parent olarak çağırmak için kullandığınız sınıftan uzatırsanız, sonsuz yinelemeye neden olur. – cronfy