2014-03-14 46 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