为什么函数在ajax文件中未定义 - 在AJAX文件中函数顺序是否重要?

时间:2014-07-25 11:45:53

标签: php ajax

我非常惊讶地看到我的函数在AJAX请求中未定义。我想知道AJAX文件中的函数顺序是否重要?以下代码将向您显示我的问题 -

这是ajax.php文件,由index.php中的jquery / ajax请求调用。它应该只是打印名称 -

<?php
if(isset($_POST))
    {
        $name = 'admin';
        echo display_name($name);
        function display_name($name)
        {
            return $name;
        }
    }
?>

但是当调用这个文件时,我得到了 -

Fatal error: Call to undefined function display_name() 

但是当我改变代码的顺序,即像这样的函数 -

<?php
if(isset($_POST))
    {
        $name = 'admin';
        function display_name($name)
        {
            return $name;
        }
        echo display_name($name);
    }
?>

然后显示 -

admin

多么奇怪!

因此,如果真正的功能可用性顺序很重要,那么下面的代码如何工作 -

这是简单的文件,不是由AJAX请求调用的。我只是加载文件并不重要写函数的位置。所有人都使用任何行代码 -

<?php
$name = 'admin';
echo display_name($name);
function display_name($name)
{
    return $name;
}
?>

以下代码段也在运作 -

<?php
$name = 'admin';
function display_name($name)
{
    return $name;
}
echo display_name($name);
?>

所以请告诉我这种差异背后的原因。在页面加载代码工作和ajax请求它没有。为什么函数display_name()是否存在未定义?

2 个答案:

答案 0 :(得分:5)

这与Ajax无关。

来自the PHP manual

  

在引用函数之前不需要定义函数,除了在有条件地定义函数时

顺序在第一个示例中很重要,因为函数在if语句中是

答案 1 :(得分:1)

我认为这个问题与调用文件作为Ajax请求无关。这与PHP的函数声明范围有关。

考虑以下情况:

if(true)
{
    function bar()
    {

    }

    $functions = get_defined_functions();
    print_r($functions["user"]);
}

function foo()
{

}

此代码将 bar foo 作为定义的函数。

但以下情况仅产生 foo 功能:

if(true)
{
    $functions = get_defined_functions();
    print_r($functions["user"]);

    function bar()
    {

    }
}

function foo()
{

}

从这里我们看到文件中的所有函数都是在加载文件时立即定义并可用的,但是如果块被解释为执行过程一步一步。

希望这有帮助。