为什么不呢?Fatal error: Cannot redeclare ok() (previously declared in ok.php:7) in try.php on line 4

解决方案 »

  1.   

    但是,这样不出错,谁解释一下:
    <?
    if(1){
    require("try.php");
    exit();
    }else{
        function ok(){
    echo "OK";
        }
    }
    ?>
      

  2.   

    可是第一个例子中 已经 exit() 了
      

  3.   

    晕,你这个exit();一点用处都没有,exit();的作用就是跳出你的if{},可是你接下来就结束你的if{}了,exit()根本没起到作用,所以后面的ok()无论如何都是会执行的,这样就产生了冲突,因为定义了两个同名同参数的函数。
    应该这样写:
    if(1){
    require("try.php");
    exit();
    function ok(){
    echo "OK";
    }
    }
    ?>
      

  4.   

    莱昂哈特你说的 exit() 没起到作用是不对的,看看这个代码:<?
    if(1){
    require("try.php");
    ok();
    exit();
    }function ok1(){
    echo "OK1";
    }
    ok1();
    ?>运行的结果只是输出了 OK,没有输出 OK1,所以 exit() 是起了作用的.
    另外,根据你的例子的确没有出错,但是如果把 if(1){} 去掉,就又出错了,例如:
    <?
    //去掉 if(1){} ,出错
    //if(1){
    require("try.php");
    exit();
    function ok(){
    echo "OK";
    }
    //}
    ?>
    然而,这样子的代码却没有错,晕倒了:
    <?
    //只去掉 if(1), 没去掉 { },没错-_-!
    //if(1)
    {
    require("try.php");
    exit();
    function ok(){
    echo "OK";
    }
    }
    ?>
    这就是花括号的作用 -_-!
      

  5.   

    是挺奇怪的,明明exit了,怎么还会运行了下面的函数
      

  6.   

    晕,不晓得,不过在PHP中,同一个名称的函数或类不可以出现两次~
      

  7.   

    看成 美人儿 了,寒~~报错是扫描的时候报错,不是实际运行,它把exit()当成一个函数了
      

  8.   

    可能是php在运行程序的时候其实是将整个文件都编译的,而不是只编译到exit();处。虽然在运行的时候不运行exit();以后的内容,但是编译器就已经无法通过而报错了。
    一时糊涂,把exit当成了break...见笑了
      

  9.   

    再次看了看问题,越看越糊涂了。难道是php的一个bug?
      

  10.   

    嘿嘿,我的4.3.9上没有报错echo 'testcon';if(1){
     require("try.php");
    exit();
    }else{
     function ok(){
     echo "OK";
     }
    } function ok(){
     echo "OK";
     } function ok(){
     echo "OK";
     }这样写也没报错,
    把两个ok拿到前面去才报错。
      

  11.   

    恭喜楼上的不报错,呵呵,因为你的php配置有问题了
    报错的,配置是正确;没报错的,配置有问题
    有时候啊,有错就是有错,要实事求事
      

  12.   

    这是因为php在扫描文件ok.php时就已编译有function ok()了.而try.php是在代码运行后扫描,此时与原来的function ok()冲突了,所以出错.
      

  13.   

    原因只有一点:作用域
    <?
    if(1){
    require("try.php");
    exit();
    }
    function ok(){
    echo "OK";
    }
    ?>
    是因为ok()函数的定义作用域是整个文件,对里面任何一个分支函数的定义都是有作用的
    <?
    if(1){
    require("try.php");
    exit();
    }else{
        function ok(){
    echo "OK";
        }
    }
    ?>
    是因为函数ok()的定义在else {}里,不会影响上面的函数定义这是C语言里的内容
      

  14.   

    这都会有疑问?不是吧,暖阳暖阳你把require换成include看看。
      

  15.   

    怎么还在讨论这个问题呢?
    ========= try.php ===========
    <?
    function ok(){
    echo "OK";
    }
    ?>
    对于
    <?
    if(1){
    require("try.php");
    exit();
    }
    function ok(){
    echo "OK";
    }
    ?>
    php首先注册主文件中的函数ok()
    然后加载并注册try.php中的函数ok(),这时发现函数ok()以被注册了,所以就抱错:
    Fatal error: Cannot redeclare ok() (previously declared in ok.php:7) in try.php on line 4
    在try.php的第4行(就是ok函数定义结素的地方)发现函数ok()已在ok.php的第7行定义了对于
    <?
    if(1){
    require("try.php");
    exit();
    }else{
        function ok(){
    echo "OK";
        }
    }
    ?>
    不抱错的原因是:函数ok的定义被放在一个永远为假的结构中,所以就被忽略掉了通常在嵌入文件中定义函数时需要先检查该函数是否已存在
    if(! function_exists("ok")):
        function ok(){
          echo "OK";
        }
    endif;
    这样就不会有问题了。