/**
*Apache/2.2.11 (Win32) PHP/5.2.8
*很弱的问题,但是我一直没搞明白,希望大家指点一下
*将*2*取消注销,执行checkName(),是没问题的
*将*1*取消注销,会提示checkName未定义
**/
if($_SERVER['REQUEST_METHOD'] == 'GET')
{
echo'
<form action="" method="POST">
<input type="text" name="name" value="">
<input type="submit" value="submit">
</form>
';
}
else
{
$name = !empty($_POST["name"]) ? trim($_POST["name"]) : '';
/*1*///checkName($name);
function checkName($str){}
/*2*///checkName($name);
}

解决方案 »

  1.   

    $name = 'zhangsan';
    //checkName($name);
    function checkName($str){}
    checkName($name);
    不会吧,我这好好的,你看看$name是什么,是不是空的
      

  2.   

    TO:kyzy_yy_pm方便的话,用我的代码测试
      

  3.   

    TO:vn700应该是,但不知点解……希望有人点拨一下
      

  4.   

    果然是if、else给限制了,5楼说的有道理,网页加载的时候function在外面会被加载,用的时候就找到了,而在else中的时候,程序会从上到下的执行,所有在定义之前调用会找不到
      

  5.   

    函数声明提出来。
    http://bugs.php.net/bug.php?id=17055
      

  6.   

    php的执行实际上是过程式的。
    你的函数在if-else里面。
    那PHP就不会把你的函数先编译进去。
    它把你的函数当成过程的一部分了。你只有把你的函数放在if-else的外面才可以,PHP才会在执行页面前预先将该函数编译进去。。
      

  7.   

    这就是解释形语言的特点
    php的预编译器只对顶级的函数进行预编译
    所以
    <?php
    checkName($name);
    function checkName($str){}
    ?>
    是不会报错的
    而对于条件分支中定义的函数要延迟到执行时才编译,于是
    <?php  
    if(1) {
      checkName($name);
      function checkName($str){}
    }
    会报错因为编译是需要时间的,编译后的虚拟机指令是要占内存的
    既然某个函数是有条件执行的,也就没有必要一开始就编译
      

  8.   

    倒是很希望php对先声明后调用进行严格检查