Может ли функция вызываться в своем собственном определении - PullRequest
0 голосов
/ 27 августа 2018

Помощь !!!!!Прежде чем сойти с ума ...

Я полностью (x3) новичок в PHP, но полон решимости учиться.

Я скачал программу, в которой файл function.php содержит:

function registerglobal() {

    $args = func_get_args();

    while (list(,$key) = each ($args)), {   
        if (isset($_GET[$key])) $value = $_GET[$key];
        if (isset($_POST[$key])) $value = $_POST[$key];
        if (isset($_FILES[$key])) $value = $_FILES[$key];

        if (isset($value)) {
            if (!ini_get ('magic_quotes_gpc')) {
                if (!is_array($value))
                    $value = addslashes($value);
                else
                    $value = slasharray($value);
            }

            $GLOBALS[$key] = $value;
            unset($value);
        }
    }
}

function slasharray ($a) { 
    while (list($k,$v) = each($a)) {
        if (!is_array($v))
            $a[$k] = addslashes($v);
        else
            $a[$k] = slasharray($v);
    }
    reset ($a);
    return ($a);
}

(1) Под function registerglobal() имеем while (list(,$key) = each ($args)), {.Является ли запятая в (,$key) правильной?

(2) Поскольку function slasharray() вызывается в предыдущем function registerglobals(), я думаю, slasharray() должен быть определен первым.Я не прав?

(3) Почему slasharray($v) под function slasharray()?Назначено ли function slasharray() конкретное идентифицируемое задание для выполнения?Отсюда мой оригинальный вопрос: можно ли вызвать функцию в ее собственном определении?

1 Ответ

0 голосов
/ 27 августа 2018

Чтобы устранить путаницу, давайте посмотрим, как php компилирует вызов функции:

<?php
 strpos("a", "b");

компилируется в этот

line # * E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   3     0  E >   INIT_FCALL                                               'strpos'
         1        SEND_VAL                                                 'a'
         2        SEND_VAL                                                 'b'
         3        DO_ICALL                                                 
         4      > RETURN                                                   1

https://3v4l.org/0pOeh/vld#output

Ивызов функции, которая не существует:

<?php
non_existant_function("a");

компилируется в этот

line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   3     0  E >   INIT_FCALL_BY_NAME                                       'non_existant_function'
         1        SEND_VAL_EX                                              'a'
         2        DO_FCALL                                      0          
         3      > RETURN                                                   1

https://3v4l.org/YEDFB/vld#output

Как вы можете видеть, в любом случаеИмя функции хранится в операндах байт-кода.Это имя функции ищется в глобальной таблице функций во время выполнения вызова (примечание: и не ранее, чем ).Адреса не принимаются, тип аргумента и число проверяются на этапе компиляции (в отличие от языков, подобных C).

...