PHP array_map循环到自身

时间:2015-09-04 16:09:47

标签: php rest

我正在使用互联网中的一些示例创建一个休息服务器。来源是: https://github.com/danucu/GUS/blob/master/restfulengine/restfulobj.php

问题是当我调用对象时,它会在方法getMyVars中再次调用自身:

protected function getMyVars($myVars = null) {
    if (empty($myVars)) {
        $myVars = $this->showMyPublicsOnly();
    }
    if (is_array($myVars)) {
        /*
         * Intorc array convertit la obiect
         * utilizand __METHOD__ (constanta ;) )
         * pentru apelurile recursive
         */
        return array_map(__METHOD__, $myVars);
    } else {
        // intorc array
        return $myVars;
    }
}

完整的休息对象在这里:

https://github.com/danucu/GUS/blob/master/restfulengine/usertest.php

当我运行localhost / rest / UserREST / example时,它会以无限循环运行。

我已将方法getMyWars更改为:

     echo $this->method."\n\n";
     echo __METHOD__."\n\n";

     $arReturn = array_map(__METHOD__, $myVars);

     print_r($arReturn);

我得到了:

  GET

 restObject::getMyVars

......无限且它永远不会到达:print_r($ arReturn);

也许我做错了什么。

2 个答案:

答案 0 :(得分:0)

嗯,那段代码看起来很奇怪,它总是会把自己调用到时代的末尾(或者至少在调用堆栈溢出之前)。让我解释一下:

{{1}}

答案 1 :(得分:0)

您的代码显然有效。我认为正在发生的是:

  • 第一次调用:getMyVars()传递,比方说,null。
  • 这是空的,因此得到$this->showMyPublicsOnly()
  • 这是一个数组,因此该数组的每个成员都应用了getMyVars()...
  • ...但其中一个值相当于空

所以,如果你有,那么,

[ 'varOne' => 'Hello', 'varTwo' => 'World', 'varThree' => 42 ];

它会起作用,但

[ 'varOne' => '', ]

会循环播放。

你可以试试这个:

// Only iterate on non-empty values
$myVars = array_filter($myVars);
// If there are no non-empty values...
if (empty($myVars)) {
    /* ...this would loop, so we return an empty array */
    return [ ];
}
return array_map(__METHOD__, $myVars);