登录

php - Fatal error: Cannot redeclare

在php交互环境中,如果已经有这样的定义:

function a(){
     return 'a';
}

现在我发现原来的写错了,需要改动

 function a(){
     return 'b';
 }

这个时候会报错, Fatal error: Cannot redeclare

如果你定义

$b=1;

再修改一次

$b=2;

php绝不会报错说,b已经被定义了,不可以再次redeclare
请问,把函数设计成不可以redeclare,道理何在?
我看了各位的答复,这个问题实际上是很普遍的,它会带来调试上的麻烦,我不知道各位如何在真实的项目环境中是如何解决的。

清让我们考虑项目场景,你写了一个函数来完成一项功能,一般不会一次就把这个函数写完美了,你需要测试吧。
我们导入它,require('myfun.php'),使用了后,发现要修改,你的打开myfun.php,进行修改,保存修改后,你的关闭上次的php -a环境,重新php -a ,然后再导入require('myfun.php')。
如果不关闭(或者说退出)php -a环境,再次导入修改后的myfun.php,会立即报错:Fatal error: Cannot redeclare。

php语言的这个特性导致调试麻烦,各位有无快捷的方法?

# PHP
高洛峰高洛峰2172 天前513 次浏览

全部回复(7) 我要回复

  • 怪我咯

    怪我咯2017-04-11 09:54:14

    能不能改下格式先?

    回复
    0
  • PHP中文网

    PHP中文网2017-04-11 09:54:14

    对于弱类型语言来说,PHP函数重载,并不像一般的OOP那样。
    因为函数重载必须满足两个条件:
    1、函数参数的个数不一样。
    2、参数的类型不一样。
    这两点,PHP都没有办法满足,您可以对函数多添加参数,只是相当于多传了个临时变量。而弱类型本来就不区分,所以无法通过这些来实现。

    http://blog.csdn.net/smartyid...

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-11 09:54:14

    函数不能重复定义 -- 这点确实和js不一样。 js里面的函数其实就是一个变量,所以可以重新赋值。但是在php中,函数并不是相当于变量,而是一个符号或者一个常量。大概因为重复定义会容易引起误解所以不让重复定义。

    回复
    0
  • 黄舟

    黄舟2017-04-11 09:54:14

    ...这是过程式的代码 没有重载概念吧。。
    第一个方法加上
    if ( ! function_exists('a')) {

    function a(){
         return 'a';
    }

    }
    然后把第二个方法的引入写在第一个之前,貌似只能这样

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-11 09:54:14

    谢邀。
    我没有更便捷的方法,主要是很少有人用交互方式测试吧?退出php -a环境重新进又不麻烦...
    很简单的测试模拟运行一下就行了,比如你可以用 https://glot.io/

    回复
    0
  • ringa_lee

    ringa_lee2017-04-11 09:54:14

    这个真的不需要纠结,而且也不用去从这个层面去纠结语言是否给重载函数

    你是特别喜欢php -a这个shell环境还是什么?

    这种问题解决方案其实很多,最简单的比如你觉得这个环境调试不方便,那就编辑一个x.php文件,然后php x.php就一次性把你修改的代码结果输出了,也就起到了调试作用。

    如果真的想用高级一点的debug方法还可以尝试xdebug

    回复
    0
  • ringa_lee

    ringa_lee2017-04-11 09:54:14

    首先,绝大部分的语言都不支持的方法重定义,PHP自然也不例外。

    其次,你的调试方法真的很奇怪,第一次见人用php -a来调试的,PHP有各种调试工具,也不差单元测试,你使用的php -a都不能算是调试。

    回复
    0
  • 取消回复发送