2011-09-26 91 views
2

我有下面的類結構:PHP棘手的問題

class Parent 
{ 
    public function process($action) 
    { 
     // i.e. processCreateMyEntity 
     $this->{'process' . $action}; 
    } 
} 

class Child extends Parent 
{ 
    protected function processCreateMyEntity 
    { 
     echo 'kiss my indecisive ass'; 
    } 
} 

我需要寫在子類中的一些方法,統一處理幾個非常類似的操作,用於創建實體。我無法更改Parent :: process,我需要從中調用這些方法。

首先想到的是magic __call方法。實體名稱是從第一個__call參數解析的。所以結構轉向:

class Parent 
{ 
    public function process($action) 
    { 
     // i.e. processCreateMyEntity 
     $this->{'process' . $action}; 
    } 
} 

class Child extends Parent 
{ 
    protected function __call($methodName, $args) 
    { 
     $entityName = $this->parseEntityNameFromMethodCalled($methodName); 
     // some actions common for a lot of entities 
    } 
} 

但事情是,__call無法保護,因爲我需要它。我在__call方法的開頭部署了一個hack方法調用,它通過debug_backtrace檢查此方法在Parent :: process中調用,但是這種方法很糟糕。

任何想法?

+0

請爲您的問題選擇一個更具描述性的標題。 – hakre

+0

我試過,但我失敗:( – zapadlo

回答

2

如果 '數' 是指3或4,我可能只是這樣做:

protected function processThis() 
{ 
    return $this->processThings(); 
} 

protected function processThat() 
{ 
    return $this->processThings(); 
} 

protected function processThings() 
{ 
    //common function 
} 

當然,也有重複的代碼,但它的確具有直接意義。有一些功能可以做類似的事情,而且很容易發現。

2

我假設你的孩子從父母延伸。

那麼你可以做的是:

public function process($action) 
{ 
    $methods = get_class_methods($this); 
    $action = 'process' . $action; 
    if(in_array($action, $methods)){ 
     $this->{$action}() 
    } 
    else { 
     die("ERROR! $action doesn't exist!"); 
    } 
} 
+0

我不能改變Parent :: process方法,即使我可以 - if(in_array($ action,$ methods))...意味着該方法必須存在。但我想要一些通用的解決方案。 – zapadlo

+1

@Zapadlo,你不能重寫它?這似乎不正確 – Neal

0

其實,你並不需要__call,你可以創建自己和保護:

class Parent 
{ 
    public function process($action) 
    { 
     // i.e. processCreateMyEntity 
     $this->entityCall('process' . $action); 
    } 
} 

class Child extends Parent 
{ 
    protected function entityCall($methodName, $args) 
    { 
     $entityName = $this->parseEntityNameFromMethodCalled($methodName); 
     // some actions common for a lot of entities 
    } 
} 

根據你的問題的說明,這應該裝修,但我不能完全肯定。