Ошибка при вызове функции внутри функции - PullRequest
0 голосов
/ 18 января 2020

Я делаю класс, который имеет несколько функций. Есть одна вещь, которая меня смущает: когда я вызываю саму функцию в ее функции:

в следующей функции, я не получаю сообщение об ошибке при вызове функции getChildKey внутри самой функции:

    function getChildKey1($FPTree)
{
  function getChildKey($FPTree){
    $result = [];
    if (isset($FPTree['child'])){
      foreach ($FPTree['child'] as $key => $value){
        $result[$key]=getChildKey($value);
      }
    }
    if (empty($result)){
      return 'gak ada array';
    }
    return $result;
  }
  $output = [];
  foreach ($FPTree as $index => $child){
    $output[$index]=getChildKey($child);
  }
return $output;
}

и я получаю сообщение об ошибке при попытке создать функцию, аналогичную функции getChildKey, которая вызывает в ней саму функцию:

function pathFinder($arr = [], $needle)
{

    $path = '';
    $paths = [];

    foreach ($arr as $key => $value) {

        if (is_array($value)) {
            $path .= $key . "->";
            pathFinder($value, $needle); //error here


        } else {
            if ($key === $needle) {
                $paths[] = $path . $key; 

            }
        }
    }
    return $paths; // return all found paths to key $needle
}

Почему это произошло ? Что мне нужно сделать, чтобы функция pathFinder могла вызывать себя в ней?

1 Ответ

0 голосов
/ 18 января 2020

Когда вы определяете функцию и вызываете ее в это время (если функция была найдена), php создает область действия, которая будет похожа на другой «дом» для всех переменных и функций, которые объявлены / определены внутри нее. По этой причине нам иногда нужно использовать ключевое слово global, когда мы хотим сослаться на $var1, которое определено вне функции (и класса, если таковые имеются), и у нас есть переменная с тем же именем, объявленным в нашей функции

CASE 1:

function A($args1)   
{ 
   //---- scope of A starts here
   function B($args2)
   { return 'hello from B'; }

    B();   // call B

   //---- scope of A ends here
}

CASE 2:

function A($args1)   
{ 
   //---- scope of A starts here

    A();   // call A
    //but where is A?

   //---- scope of A ends here
}

В 1-м случае блок функции A (что-либо между {}) является автономным блоком, то есть имеет все что любой код внутри него потребуется для запуска. Поэтому, когда встречается B(), php смотрит в область действия A, определена ли какая-либо функция с именем B? Да!

Во 2-м случае PHP делает то же самое, когда встречает A(), но, не найдя его там, он смотрит в глобальную область ie. весь код, который находится за пределами вашего класса, чтобы найти функцию с именем A. Так как ее нет, она выдает исключение

. Когда вы используете $this->A() php, знает, где искать эту функцию ie. Внутри того же объекта, откуда она была вызвана, и она запускается. совершенно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...