帮助!!!!在我发疯之前...
我对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()
分配了特定的,可识别的任务来执行?因此,我的最初问题是:一个人可以在其定义内调用函数吗?
答案 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等语言不同)。