PHP array_map зацикливается на себе

1

Я создаю сервер отдыха, используя некоторые примеры в Интернете. Источник: 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/пример, он работает в бесконечном цикле.

Я изменил метод getMyWars на:

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

     $arReturn = array_map(__METHOD__, $myVars);

     print_r($arReturn);

И я получил:

  GET

 restObject::getMyVars

... бесконечно и никогда не достигает: print_r ($ arReturn);

Может быть, я что-то делаю неправильно.

Теги:
rest

2 ответа

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);
0

Ну, этот код выглядит действительно странным, он всегда будет называть себя до конца времен (или, по крайней мере, до тех пор, пока переполнение вызовов не переполнится). Позволь мне объяснить:

if (is_array($myVars)) { //is_array === true
    return array_map(__METHOD__, $myVars); // This will call __METHOD__ (getMyVars); and pass $myVars to it (which is an array).
} else { //This will never be reached.
    return $myVars;
}
  • 0
    __METHOD__ будут передаваться все значения в $myVars одно за другим, не так ли? Не оригинальный массив.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню