2014-04-01 80 views
-1

我上課是這樣的:檢查調用靜態方法PHP

class Foo 
{ 
    puclic static function blindPaths($paths) 
    { 
     foreach($paths as $name=>$path) 
     { 
      $method='set'.ucfirst($name).'Path'; 
      if(method_exists(????,$method)) 
       self::$method($path); 
     } 
    } 

    public function setBasePath($base) 
    { 
     //do something... 
    } 

    public function setAppPath($app) 
    { 
     //do something... 
    } 

    .... 
} 
現在

,我呼籲:

$paths = array(
    'base'=>'path.of.base.path', 
    'app'=>'path.of.app.path', 
    'someValue'=>'path.of.someValuePath', 
    .... 
); 
Foo::blindPaths($paths); 

問題的時候檢查method_exists,如何填補這些標記「???? 「有人可以幫助我?

+1

[TFM](http://php.net/method_exists)有例子。 – deceze

+0

^- «你是一個詩人,甚至不知道它。 –

回答

2
if(method_exists(__CLASS__, $method)) 
1

在一個簡單的,單一類情況下,你可以使用__CLASS__常量作爲method_exists呼叫的第一個參數,但如果你在靜態方法是在父級別定義的情況是(或抽象類,或別的地方),那麼也許你可能要考慮這一點:

puclic static function blindPaths($paths) 
{ 
    $current = get_called_class(); 
    foreach($paths as $name=>$path) 
    { 
     $method='set'.ucfirst($name).'Path'; 
     if(method_exists($current,$method)) 
      self::$method($path); 
    } 
} 

或者,如果您添加接口和Trait的進來:

puclic static function blindPaths($paths) 
{ 
    $current = get_called_class(); 
    $current = new $current;//create instance 
    foreach($paths as $name=>$path) 
    { 
     $method='set'.ucfirst($name).'Path'; 
     if($current instanceof Foo) 
      self::$method($path); 
     elseif ($current instanceof Bar) 
      return $this->{$method}($path); 
    } 
} 

但無論如何,請重新考慮您的設計。如果你使用的結構與你現在的結構相似,10次中的9次,你就會吼出錯誤的樹。