Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调用未定义的函数,为什么?_Php - Fatal编程技术网

Php 调用未定义的函数,为什么?

Php 调用未定义的函数,为什么?,php,Php,我用php编写了以下脚本: if($_SERVER['REQUEST_METHOD'] == 'POST'){ if(isset($_POST['data_id']) && $_POST['data_id'] != NULL){ $data = $_POST['data_id']; DoConfig($data); function DoConfig($param_data){ echo $param_data; } } }else{ ec

我用php编写了以下脚本:

if($_SERVER['REQUEST_METHOD'] == 'POST'){

if(isset($_POST['data_id']) && $_POST['data_id'] != NULL){

  $data = $_POST['data_id'];
  DoConfig($data);

  function DoConfig($param_data){
    echo $param_data;
  }    
}

}else{
echo '0';
}

我不明白为什么调用未定义的函数时会出现错误,如何修复它?

PHP是按顺序执行的-在使用函数之前声明函数,你会没事的


详细说明-在PHP中,整个文件都会加载,并根据作用域进行解析。如果函数位于全局范围的末尾,这将起作用,因为此时全局范围是在输入条件的子范围之前计算的。由于您正在使用
if
输入子作用域,因此同样的求值顺序适用-函数在其当前作用域中使用之前需要求值。

您的代码失败,因为函数是在
if()
循环中声明的,并且是在调用之后声明的。您可以将它移到
if()
之外,并仍然将其保留在脚本的底部,但最佳实践表明情况并非如此

在使用函数之前,在任何条件或循环之外声明函数;最好是在一个单独的文件中,或者至少在脚本的最顶端。例如:

function DoConfig($param_data) {
    echo $param_data;
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['data_id']) && $_POST['data_id'] != NULL) {
        $data = $_POST['data_id'];
        DoConfig($data);
    }
} else {
    echo '0';
}

请将
DoConfig
函数置于
if-else条件之外

if($_SERVER['REQUEST_METHOD'] == 'POST'){

    if(isset($_POST['data_id']) && $_POST['data_id'] != NULL){

     $data = $_POST['data_id'];
     DoConfig($data);

    }

 }else{
  echo '0';
 }
 function DoConfig($param_data){
   echo $param_data;
 }

您需要在调用函数之前声明它。做:

function DoConfig($param_data){
echo $param_data;
}

if($_SERVER['REQUEST_METHOD'] == 'POST'){

if(isset($_POST['data_id']) && $_POST['data_id'] != NULL){

$data = $_POST['data_id'];
DoConfig($data);



}

}else{
echo '0';
}

好吧,告诉我更多。。在我的实际项目中,在函数DoConfig中,我在PDO中插入了数据库,因此如果我将这些函数放在“if”之外,安全性有问题吗?

*在if语句中创建函数不是最佳做法*因为如果条件为true,将调用该函数,否则在以后调用该函数时将出现未定义的错误。你甚至在函数被创建之前就调用了它,这就是为什么要给出未定义的错误

所以最好在if语句之外创建函数,并在任何地方运行它

//Creating function first and then calling it afterwards
function DoConfig($param_data)
{
            echo $param_data;
}

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

        if(isset($_POST['data_id']) && $_POST['data_id'] != NULL){

          $data = $_POST['data_id'];
          //Function call
          DoConfig($data);
        }
}else
{
echo '0';
}
根据您的答案编辑:如果您在if语句之外创建它,则绝对不会有安全问题,需要时使用函数

或者,为了将来的目的,如果您在if语句中创建函数,则使用 函数_将在以后使用exist方法,这样您就不会得到未定义的错误

您正在创建DoConfig函数之前调用它。值得注意的是,如果函数DoConfig()是在条件块之外声明的,它会工作得很好,甚至在声明之前“调用”它。你完全可以在一个条件中声明一个函数。我自己刚刚发现了这一点。你每天都会学到新的东西。这正是正确的答案。我的+1献给你!函数应该是条件外的。如果函数在条件外,可以在调用后声明。我可能错了,但你的回答可能有一半是对的。如果函数是在If之外和之后声明的,它将工作。。。文件最初是解析的,如果函数在外部,它是否随时可用。不,你是正确的-这个答案是误导性的。它不起作用,因为函数是有条件定义的。如果函数是在全局作用域中声明的,则可以在任何地方调用它,甚至在定义它之前在文件中的某个位置调用。在这种情况下,意外地,是的,因为在执行内部作用域之前,外部作用域已完全求值(包括声明)。详细阐述了PHP的这一特性。