【问题标题】:PHP static method recursivePHP静态方法递归
【发布时间】:2014-04-19 04:29:24
【问题描述】:

是否可以对静态方法进行递归?

    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”或函数名称无效。

谢谢!

【问题讨论】:

  • 在指定对象或类回调时,您必须使用"self::funcName"array("self",__FUNCTION__) 而不是普通的函数名称字符串。

标签: php recursion methods static


【解决方案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】:

    试试这个

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

    array_map 允许callable 类型。

    你可以试试magic constants

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

    或使用self

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

    【讨论】:

    • 太棒了!谢谢这个!!!我认为使用魔术常量是最好的答案,尤其是在更新类或方法名称时。无需编辑返回行,因为它会自动获取类名和方法本身。
    • 你也可以只使用[__CLASS__, __METHOD__]而不是__METHOD__: return array_map(__METHOD__, $obj);
    【解决方案3】:

    您可以递归调用静态方法。这 例如,以下代码可以正常工作:

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

    【讨论】:

    • 这是问题OP标题的正确答案
    猜你喜欢
    • 2012-10-22
    • 2014-01-09
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2018-01-08
    相关资源
    最近更新 更多