2014-03-14 84 views
4

是否可以對靜態方法執行遞歸?PHP靜態方法遞歸

嚴重性:警告

消息:

class Helpers { 
     public static function objectToArray($obj) { 
      if (is_object($obj)) { 
       $obj = get_object_vars($obj); 
      } 

      if (is_array($obj)) { 
       return array_map(__FUNCTION__, $obj); 
      } 
      else { 
       return $obj; 
      } 
     } 
    } 

執行時,我得到這個錯誤array_map()預計參數1是一個有效的回調,功能 'objectToArray' 未找到或無效的功能名稱。

謝謝!

+0

當指定你必須使用'「自我::了funcName」'或'陣列(「自我」,__功能__)',而不是一個對象或類回調一個普通的函數名字符串。 – mario

回答

3

試試這個

return array_map(['Helpers', 'objectToArray'], $obj); 

array_map permit callable type。

您可以用magic constants

return array_map([__CLASS__, __METHOD__], $obj); 

或者用self

return array_map([self, __METHOD__], $obj); 
+1

太棒了!感謝這!我認爲使用魔術常量是最好的答案,尤其是在更新類或方法名稱時。沒有必要編輯返回行,因爲它會自動獲取類的名稱和方法本身。 – basagabi

+0

而不是'[__CLASS__,__METHOD __]'你也可以使用'__METHOD__':'return array_map(__ METHOD__,$ obj);' –

1

應使用:

return array_map('self::objectToArray', $obj); 

//或

return array_map(array(self, 'objectToArray'), $obj); 

爲您提供一個替代解決方案(編碼對象到JSON字符串,然後將其解碼爲一個數組):

class Helpers { 
    public static function objectToArray($obj) { 
     return json_decode(json_encode($obj), true); 
    } 
} 
2

您可以遞歸調用靜態方法嘗試。該 下面的代碼,例如,將正常工作:

<?php 
class MyClass{ 
    public static function test($count) 
    {  
     if($count<10) 
     { 
      $count++; 
      self::test($count); 

      echo $count;     
     } 
    } 
} 

MyClass::test(0); 
+1

這是問題OP標題的正確答案 – mehany