www.baike369.com
百科369 > PHP教程 > PHP未定义符号

PHP未定义符号


PHP未定义符号

“未定义符号”的错误在PHP页面中显示为“Undefined Symbols”。

引发该错误的原因是在PHP执行时可能遇到一些变量名、函数,这时它并不理解。因为PHP是一个松散型的解释语言,它如果没有完全了解所有符号名称和功能名称就会停止解释执行。

这是个致命的错误,多半是PHP缺少编译模块的问题,我们可以尝试在PHP或Apache的LOG日志中查找错误的原因。

1. 常量与变量

在PHP中,常量与变量是会经常用到的,如果没有声明就使用一个变量,会触发NOTICE错误,如下代码:

<?php
var_dump($undefine_variable);
var_dump(UNDEFINED_CONSTANT);
echo "错误显示\n";
?>

上面的例子将输出如下代码:

Notice: Undefined variable: undefine_variable in F:\PHPfile\PHPCeShi\PHPCeShi.php on line 2
NULL
Notice: Use of undefined constant UNDEFINED_CONSTANT - assumed 'UNDEFINED_CONSTANT' in F:\PHPfile\PHPCeShi\PHPCeShi.php on line 3
string(18) "UNDEFINED_CONSTANT" 错误显示

在上面的例子中,第一个错误是没有定义$undefine_variable变量而直接使用,而第二个错误是var_dump打印的字符串没有使用引用,加上字符串的定界符,双引号和单引号都可以,如果是把这个字符串作为常量,事先应该用define关键字定义常量。

请注意这个提示不是Error,也不是Warning,而是Notice(不是程序错误,仅仅是通知用户)。error_reporting中该错误的显示与否与php.ini配置中[Error handling and logging]项的设置有关。

解决方法有两种,一是将Notice提示的信息中出现没有初始化的变量初始化,二是将php.ini中error_reporting的值修改如下:

error_reporting = E_ALL & ~E_NOTICE

重启Apache服务器,再运行上面的代码会正常运行,而不会出现Notice错误。

在技术上,因为PHP的松散定义,利用未定义的变量是允许的,如果我们用上述方法关掉它,则不会产生任何错误预告信息,注意有时会丢失信息。因为,建议仍然使用默认建议值:

error_reporting = E_ALL

这样可以使我们编写的程序更严密,也更安全,如果想让我们的用户体验更好,可以使用@符号屏蔽一些错误信息的输出。

2. 数组索引

我们先看下面这个例子:

<?php
if($_GET["name"]){
  echo "您好,$_GET[name]!<br />\n";
}
?>

如果该页没有得到$_GET超级变量内容,PHP将显示错误:

Notice: Undefined index: name in F:\PHPfile\PHPCeShi\PHPCeShi.php on line 2

和前面的问题相同,因为变量没有初始化,导致提示的发生,因此我们需要将条件改写如下:

<?php
if(isset($_GET["name"])&&!empty($_GET["name"])){
  echo "您好,$_GET[name]!<br />\n";
}
?>

即如果有此变量定义且内容不为空,再打印问候语。

3. 函数与类

在PHP脚本运行时,当遇到一个未定义的函数时,会立即停止,并报告给用户不能调用这个未定义的函数:

<?php
echo "错误要来啦:\n";
undefined_this_function_is();
print "这里运行不到.\n";
?>

上面的例子输出结果如下:

错误要来啦:
Fatal error: Call to undefined function undefined_this_function_is() in F:\PHPfile\PHPCeShi\PHPCeShi.php on line 3

可以看到第3行的打印语句是不会运行的。

下面的例子和上例类似,但它试图调用一个未定义的类:

<?php
echo "错误要来啦:\n";
new undefimed_class;
print "这里运行不到.\n";
?>

该例将输出,没有找到undefined_class类:

错误要来啦:
Fatal error: Class 'undefimed_class' not found in F:\PHPfile\PHPCeShi\PHPCeShi.php on line 3

4. 编程逻辑错误

发现错误或未定义解析符号相对比较容易,比较微妙难寻的错误多数是在编程逻辑上的错误,PHP有时就误认为或根本是在瞎指挥,告诉我们是在某某处有问题,这点需要注意。

最好的办法是找到错误逻辑测试结合代码审查,对处理较复杂的逻辑时,可以先在纸上过一遍流程,再开始编写程序。

Copyright© 2011-2016 www.baike369.com All Rights Reserved