无法在exit()内调用函数

4

commons.php中定义一个函数

desktop.php -> include commons.php
    |
    |
   \|/
    include MODULES.'mod.php'

我可以在任何地方调用自定义函数,但不能在 if 语句内的 exit 中调用。以下代码中调用函数的部分将不会执行:
Mod.php:
....
$error = mysql_error();

if($_ADM['id_user']==1) {
    if(!empty($error)) {
        $debug = array(
                    'message' => "SQL Error in infography_edit module.",
                    'line'    => '79',
                    'error'   => $error,
                    'SQL'     => $SQL
                );
        //exit(myPrint($debug)); //Calling here myPrint does not work
          exit(print_r($debug)); //This works
     }
 }

 $test = array('alex');
 exit(myPrint($debug)); //Calling here myPrint works

....

// The output error: Call to undefined function myPrint()

我就是无法理解为什么除了上述代码以外的任何其他地方都能够正常工作,但是在其中没有重新定义变量的情况下不能正常工作。

更新

以这种方式做似乎也不起作用:

myPrint($debug);
exit();
// The output error: Call to undefined function myPrint()

更新2

主文件 desktop.php:

  1. 要求(require) libs 文件夹下的 commons.php 文件;
  2. 插入通用 HTML 代码;
  3. 包含相关模块。

桌面端的代码可在以下链接中查看:http://codepad.org/hn8QlHQ9


2
检查一下你的花括号。你在 if 语句周围没有加上任何花括号。 - gen_Eric
2
根据更新2:在调用exit();之前,您没有包含包含函数定义的文件! - DaveRandom
@DaveRandom 我在加载模块之前确实包含了commons.php。正如我所提到的,调用myPrint在if语句外部是可以工作的...但在内部就不行。 - Alex
@Rocket 大括号与此无关。但是我也试过加上它们,仍然没有任何作用。 - Alex
print_r($debug) 会将内容输出到屏幕上并且不返回任何值。而 print_r($debug, true) 则会返回一个字符串。 - gen_Eric
显示剩余5条评论
5个回答

1

像解决问题的方法怎么样?

function my_exit($msg){
   echo $msg;
   exit(1);  //Return code of the script, useful for cli scripts
}

//...
my_exit("Show message");
//...

0
首先,我必须澄清一下,我正在处理的代码不是我的,我只是被雇来进行一些改进,并不得不与主要开发人员交谈以解释那种混乱。
我一直忽略的是每个请求(与页面刷新有关的每个请求)都通过一个名为do.php的辅助文件进行处理,最终再次加载我所在的模块。
可视化说明:
Currently at          Action                Pre-Processor        Processor 
-------------    =>   ---------------   =>  -------------    =>  ---------
add_users.php         post from form        do.php               add_user.php

现在,你要知道的是,当前模块位置(http://site.com/module?=add_users)保存在会话中,do.php 有几行代码来检查该会话,并在一切正常时包含回模块。我知道这是一个巨大的混乱,但我无能为力。
所以,最终我不得不去 do.php,并在文件开头附近添加以下行:require_once('libs/commons.php');

 

我的建议

每当您发现某个函数无法加载,但您知道在某些情况下它可以完美加载时,请查找可能会干扰的任何其他文件,就像上面的do.php一样,并尝试包含/需要包含包含该函数的文件。

我知道这些事情可能会让人头痛,但事实就是如此,大多数情况并不是我们的错,而是平台已经编写好的方式。

祝大家好运


0

您的代码应该在满足条件的情况下正常工作。

调用未定义的函数myPrint()

上述错误表示函数myPrint()未定义。您可以使用function_exists()函数检查特定函数是否存在。如果不存在,则可以在当前上下文中重新定义它。

<?php
if (function_exists('myPrint')) {
    echo "myPrint() exists.\n";
} else {
    echo "myPrint() doesn't exist.\n";
}
?> 

请检查我的更新,因为通常在exit内部调用一个函数对我来说是有效的。 - Alex
1
exit() 无法执行函数,这没有任何意义。它可以像 PHP 中的任何其他东西一样“执行函数”(除了 empty),唯一需要考虑的是函数的返回类型。 - gen_Eric
这里的关键点是嵌套函数是从内向外执行的。 - DaveRandom
看看我的帖子,它是有效的。拿走我的示例并尝试一下。记住:PHP手册并不总是最新的。 - transilvlad
1
不是退出的问题,而是由于某些原因函数无法在if语句内执行的事实。 - Alex
@w0rldart 在调用 exit() 函数之前尝试使用 echo 输出一个字符串,以便测试代码是否按预期运行。它能够输出该字符串吗? - Robert

0

exit() 是一种语言结构,只能接受 intstring 类型的标量值。如果您需要在退出脚本之前打印任何内容,建议在调用 exit 之前执行。

....
$error = mysql_error();

if($_ADM['id_user']==1)
    if(!empty($error))
        $debug = array(
                    'message' => "SQL Error in infography_edit module.",
                    'line'    => '79',
                    'error'   => $error,
                    'SQL'     => $SQL
                );
        myPrint($debug);
        exit();
....

我假设 myPrint 返回一个字符串。 - gen_Eric
@Rocket 我认为这里有太多的TL;DR了,只不过在这种情况下它只是DR。 - DaveRandom
如果不是简单地在前面添加“echo”或“print”就可以完成工作。 - user188654
错误指的是“未定义函数”。更改myPrint函数不会产生影响。 - transilvlad

0

你是否使用命名空间?你确定你的函数已经定义了吗?如果已经包含,你确定你已经包含它了吗?

P.S. RobB,很抱歉告诉你但是它确实有效。

示例:

$v = 1234;
function xyz($v){
    echo $v . 23;
}
exit( xyz($v) );

1
命名空间不是一个坏主意(可以说是第一个明智的建议) - DaveRandom
如果他已经定义了该函数,那么除非他使用命名空间,否则它不能未被定义。据我所知,在代码中函数变得未定义的唯一方式是使用错误的方法。 - transilvlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接