/**
*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);
}
//checkName($name);
function checkName($str){}
checkName($name);
不会吧,我这好好的,你看看$name是什么,是不是空的
http://bugs.php.net/bug.php?id=17055
你的函数在if-else里面。
那PHP就不会把你的函数先编译进去。
它把你的函数当成过程的一部分了。你只有把你的函数放在if-else的外面才可以,PHP才会在执行页面前预先将该函数编译进去。。
php的预编译器只对顶级的函数进行预编译
所以
<?php
checkName($name);
function checkName($str){}
?>
是不会报错的
而对于条件分支中定义的函数要延迟到执行时才编译,于是
<?php
if(1) {
checkName($name);
function checkName($str){}
}
会报错因为编译是需要时间的,编译后的虚拟机指令是要占内存的
既然某个函数是有条件执行的,也就没有必要一开始就编译