解决PHP提示Notice: Undefined variable的办法

 更新时间:2016年11月25日 17:36  点击:1523
Undefined variable错误是什么问题呢,小编觉得这个是程序错误了,那么碰到Undefined variable要如何解决呢,我们一起来看看具体的解决办法吧。

我们知道在 php 中,变量通常是不需要定义直接使用的,但有的时候因为 php 环境的问题会出现各种各样奇奇怪怪的事情,今天在调试程序的时候直接提示 Notice: Undefined variable 的错误,这是因为有的变量没有定义造成的,也是晕了,好吧,这种问题直接一句屏蔽误句就搞定了。

直接在程序的最顶端插入一句 error_reporting(0); 相信就不会再暴露这样的问题了,也不耽误程序的运行,当然这个只是应急的方法,我们还是要好好检查程序哪里出现的问题,然后对症下药,对于直接屏蔽问题夏日博客再总结几种方法吧。

php.ini 配置文件中的修改

在php.ini中的302行 error_reporting = E_ALL
修改成
error_reporting = E_ALL & ~E_NOTICE 再重启apache2.2就行了
解决方法:修改php.ini
将: error_reporting = E_ALL
修改为:error_reporting = E_ALL & ~E_NOTICE
如果什么错误都不想让显示,直接修改:
display_errors = Off
如果你没有php.ini的修改权限,可在php头部加入:
ini_set("error_reporting","E_ALL & ~E_NOTICE");

php文件中的修改

如果你没有php.ini的修改权限,可在php头部加入 ini_set("error_reporting","E_ALL & ~E_NOTICE"); 或者 error_reporting(0);// 即可。

一般情况下直接建议在 php 文件中进行添加,这种方法简单,不用去修改服务端的 php.ini 了。

foreach循环在php使用时我们需要注意一些事项了,那么到底是需要注意哪些事项呢,下面我们来看一篇关于php foreach循环使用引用注意事项文章,具体如下。

看过PHP相关书籍的都会了解到PHP有个这样的特性:写时复制。所以在用foreach时,需要对数据做修改的时候,都会复制数据,如果数据很大,那么就会带来一定的内存消耗,所以为了避免这种复制操作,就用到了引用,下面就介绍下引用的坑

问题案例

<?php
    $arr = array(4, 5, 6);
    var_dump($arr);

    foreach ($arr as &$v) {
        //do something here
    }

    foreach ($arr as $v) {
        //do something here
    }
    var_dump($arr);
?>

输出为:

array(3) {
  [0]=>
  int(4)
  [1]=>
  int(5)
  [2]=>
  int(6)
}
array(3) {
  [0]=>
  int(4)
  [1]=>
  int(5)
  [2]=>
  &int(5)
}
问题分析

foreach 中不使用引用就没事, 用 foreach $k => $v 然后 $ar[$k] 来改变原始数组, 略微损失点效率。
执行第一个使用引用的 foreach 时:

一开始, $v 指向 $arr[0] 的存储空间,空间内存储着 4 , foreach 结束时, $v 指向 $arr[2] 的存储空间,空间内存储着 6 。

开始执行第二个 foreach 时:

注意和第一个 foreach 不同, 第二个 foreach 没有使用引用,那么就是赋值方式, 即将 $arr 的值依次 赋值 给 $v 。 进行到第一个元素时,要将 $ar[0] 赋值给 $v 。 问题就在这里,由于刚刚执行完第一个 foreach, $v 不是一个新变量,而是已经存在的、指向 $arr[2] 的那个 引用 , 如此一来,对 $v 进行赋值的时候,就将 $arr[0] = 4 写入了 $arr[2] 的实际存储空间, 相当于对 $arr[2] 进行赋值。 依此类推,第二个 foreach 执行的结果, 就是数组的最后一个元素变成了倒数第二个元素的值。

PHP 的开发者也认为,这种情况属于语言特性造成的,不是 bug。要修复这个问题,一种方法是对 foreach 进行特殊处理, 另一种就是限制 foreach 中 $v 的作用域, 这两种方式都与目前 PHP 的语言特性不符,开发人员不愿改, 但还是在 官方文档 中用 Warning 进行了说明。
解决方案

简单的方法,就是在使用了引用的 foreach 之后, unset 掉 $v
修改后的案例:

<?php
    $arr = array(4, 5, 6);
    var_dump($arr);

    foreach ($arr as &$v) {
    //do something here
    }
    unset($v);

    foreach ($arr as $v) {
    //do something here
    }
    var_dump($arr);
?>

输出:

array(3) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(6)
}
array(3) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(6)
}

补充:

foreach虽然简单,不过它可能会出现一些意外的行为,特别是代码涉及引用的情况下。

下面列举了几种case,有助于我们进一步认清foreach的本质

$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
// now $arr is array(2, 4, 6)
foreach($arr as $k => $v) {
    echo "$k", " => ", "$v";
}
先从简单的开始,如果我们尝试运行上述代码,就会发现最后输出为0=>2  1=>4  2=>4 。

为何不是0=>2  1=>4  2=>6 ?

其实,我们可以认为 foreach($arr as $k => $v) 结构隐含了如下操作,分别将数组当前的'键'和当前的'值'赋给变量$k和$v。具体展开形如:

foreach($arr as $k => $v){
    //在用户代码执行之前隐含了2个赋值操作
    $v = currentVal();
    $k = currentKey();
    //继续运行用户代码
    ……
}
根据上述理论,现在我们重新来分析下第一个foreach:

第1遍循环,由于$v是一个引用,因此$v = &$arr[0],$v=$v*2相当于$arr[0]*2,因此$arr变成2,2,3

第2遍循环,$v = &$arr[1],$arr变成2,4,3

第3遍循环,$v = &$arr[2],$arr变成2,4,6

随后代码进入了第二个foreach:
第1遍循环,隐含操作$v=$arr[0]被触发,由于此时$v仍然是$arr[2]的引用,即相当于$arr[2]=$arr[0],$arr变成2,4,2

第2遍循环,$v=$arr[1],即$arr[2]=$arr[1],$arr变成2,4,4

第3遍循环,$v=$arr[2],即$arr[2]=$arr[2],$arr变成2,4,4

OK,分析完毕。

如何解决类似问题呢?php手册上有一段提醒:

Warning : 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用unset()来将其销毁。
$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
unset($v);
foreach($arr as $k => $v) {
    echo "$k", " => ", "$v";
}
// 输出 0=>2  1=>4  2=>6
从这个问题中我们可以看出,引用很有可能会伴随副作用。如果不希望无意识的修改导致数组内容变更,最好及时unset掉这些引用。

unset只会删除变量。并不会清空变量值对应的内存空间:(这是与指针不同的地方
如下:

$a = "str"; 
$b = &$a; 
unset($b); 
echo $a;

依然输出   str

下面我们来看一篇关于phpunit遇到You cannot serialize or unserialize PDO instances问题的解决方案,具体的如下所示。

globalsBackup causes: PDOException: You cannot serialize or unserialize PDO instances。

在PHPUnit/Frameword/TestCase.php文件中,有一行protected $backupGlobals = TRUE;

把backupGlobals 改为false即可解决这个问题。不过从PHPUNIT开发小组成员的建议来看,他们是不支持用修改backupGlobals的值来解决这个问题的。

The majority of users of PHPUnit expects it to work as it does when the backup of $GLOBALSfeature is enabled. This is why it is enabled by default.
If your tests exercise code that puts unserializable objects into $GLOBALS you can disable the feature.
From a software design perspective, you should not have a global instance of PDO to begin with.

所以更好的解决方法就是在:

$db = SmartPHP_Db::factory($dbConfig);

SmartPHP_Pool::set("db" , $db);
SmartPHP_Db_Table::setDefaultAdapter($db);
这段代码之后,再添加一句:

unset($db);
这样子就完美解决了You cannot serialize or unserialize PDO instances这个问题。

 

下面我们来看一篇关于php报错FastCGI sent in stderr “PHP Fatal error: Allowed memory size of”错误,希望此文章能够帮助到各位朋友。

PHP的memory_limit值的默认配置是128M,但是根据处理内容有时候会发生如下错误。

FastCGI sent in stderr: “PHP message: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 39858177 bytes)

可以通过修改memory_limit值来,回避以上错误的出现。

修改memory_limit值。

# vi /etc/php.ini
;memory_limit = 128M
memory_limit = 256M

修改php.ini文件之后,重启Apache或者Nginx。

# /etc/init.d/httpd restart  # 重启Apache
# /etc/init.d/nginx restart  # 重启Nginx

memory_limit = -1为,无限制。

/etc/php.ini里的默认配置如下。

; Maximum amount of memory a script may consume (128MB)
; http://www.php.net/manual/en/ini.core.php#ini.memory-limit
memory_limit = 128M

一个线程的最大内存使用量,即一个Web请求可使用的PHP内存量。

[!--infotagslink--]

相关文章

  • 409错误是什么 http 409错误怎么解决

    409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • php错误提示 open_basedir restriction in effect 解决

    今天在帮助一个朋友配置一台服务器时发现网站配置好了缓存目录读写不成功,在打开错误时发现提示 Warning: file_exists() [function.file-exists]: open_basedir restr...2016-11-25
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
  • 解决Antd Table表头加Icon和气泡提示的坑

    这篇文章主要介绍了解决Antd Table表头加Icon和气泡提示的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17
  • mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决

    在windows下安装Mysql系统日志出现max_open_files: 2048 max_connections: 510 table_cache: 764 类似错误是因为 max_connections 最大连接数和max_open_files、table_cache 不匹配。适当的降低max_connections 或调...2014-05-31
  • Jrebel启动失败解决方案详解

    这篇文章主要介绍了Jrebel启动失败解决方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-07
  • 解决jquery插件:TypeError:$.browser is undefined报错的方法

    首先先说一说$.browser browser就是用来获取浏览器基本信息的。 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需...2015-11-24
  • JavaScript实现输入框(密码框)出现提示语

    有时候我们需要在登陆表单有一些提示语言,比如“请输入用户名”和“请输入密码”等语言,通过本文给大家介绍JavaScript实现输入框(密码框)出现提示语的相关知识,对js实现输入框提示相关知识感兴趣的朋友一起学习吧...2016-01-14
  • 详解pycharm的python包opencv(cv2)无代码提示问题的解决

    这篇文章主要介绍了详解pycharm的python包opencv(cv2)无代码提示问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29
  • 小记一次mysql主从配置解决方案

      今天研究了个开源项目,数据库是mysql的,其中的脚本数据需要备份,由于本人的机器时mac pro,而且mac下的数据库连接工具都不怎么好用,就想着如何利用windows下的数据库连接工具使用,并做相关备份,另外windows系统下的sqlyo...2015-10-21
  • js滑动提示效果代码分享

    这篇文章主要为大家分享了js滑动提示效果代码,实现方法简单,感兴趣的小伙伴们可以参考一下...2016-03-12
  • php 502 bad gateway的解决方案

    502 bad gateway是php-fpm的问题对于这个问题就是配置参数的问题了,下面我们整理了一些关于php-fpm错误问题的解决办法,具体如下。 今天升级完PHP出现了502 Bad Gat...2016-11-25