是否可以在其自己的定义内调用函数

时间:2018-08-27 07:47:13

标签: php function

帮助!!!!在我发疯之前...

我对PHP完全陌生(x3),但决心学习。

我下载了一个其中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 :(得分:0)

为消除混乱,让我们看看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等语言不同)。