当我尝试定义已经定义的函数时,我可以让PHP抛出错误吗?

时间:2010-01-22 16:11:07

标签: php

我会定期遇到这个问题,我正在试图弄清楚它是配置问题还是PHP的特性。

基本上,我的代码中会有一个函数foo()定义,然后在其他地方我会不小心用同名foo()定义一个函数。我希望会抛出某种错误,例如“致命错误:功能已定义第234行,bar.php等等。”

但我一无所获。我只是得到一个空白的屏幕。调试可能会花费一些时间,因为我试图准确地确定函数被意外重新定义的位置,而无需错误消息的帮助。

我报告错误的配置设置被设置为E_ALL,我看到了所有其他类型的错误。

任何见解?我可以做些什么来导致PHP报告这些错误(这样我可以重命名有问题的函数或将其包装在if function_exists()子句中)?

编辑:为了清楚起见,我理解了避免PHP中命名空间冲突的许多策略。我说的是无论出于何种原因,我意外将函数命名为开发过程中已存在的名称(或者例如我导入已定义函数的文件)的实例。我希望在发生这种情况时会出现错误消息,这有助于我调试,但我没有得到。

5 个答案:

答案 0 :(得分:4)

您可以将函数定义包装在条件function_exists()

if (!function_exists("file_get_contents"))
 {
   function file_get_contents(....)
     ....
 }

适合我。

您可以对每个函数进行function_exists检查,如果已经存在,则会抛出错误消息。然而,更好的方法是找出为什么致命错误不会出现在屏幕上。您可以查看phpinfo()的error_reporting和相关设置吗?

这是您在尝试重新定义函数时应该得到的:

Fatal error: Cannot redeclare file_get_contents() in D:\xyz\htdocs\test.php on line 5

来自我的phpinfo()

  

display_errors 开启

     

error_reporting 22519(等于......好吧,我不知道,但它显示错误:)

在某些托管环境中完全关闭错误报告时,我发现定义自定义错误处理程序非常有用:set_error_handler()

答案 1 :(得分:1)

您是否在本地服务器上托管脚本?我知道一家英国托管公司,即使您已设置E_ALL,也可以防止任何PHP错误被退回。

如果是这种情况,请考虑在本地测试应用并启用错误报告。

答案 2 :(得分:0)

作为替代方案,您可以使用function_exists实际检查功能是否已存在。

if (function_exists('foo'))
{
  echo 'foo function exists !!';
}
else
{
  echo 'foo function does not exists !!';
}

答案 3 :(得分:0)

一些让您的生活更轻松的建议:

我通常会创建一个通用函数文件,在那里我存储我将在整个应用程序中使用的所有全局函数。

我也会尝试尽可能保持面向对象。如果您正在创建一个已存在的对象,PHP将会出错,并且通过将您的函数封装到逻辑对象中,您可以更轻松地维护它。

答案 4 :(得分:0)

您似乎没有正确组织代码,尝试使用文件中包含的公共库,并在那里定义函数。也许您只需要启动使用类,当您有两个具有相同名称的函数时,就不会发生冲突。