|
我在操作 PHP 脚本并继续收到以下错误:! s- D' R) F Q, h
注:未定义变量:第 10 行 C:\wamp\www\mypath\index.php 中的 my_variable_name4 ~+ n; N5 J6 F# k, b$ `
注:未定义索引: 11 行 my_index C:\wamp\www\mypath\index.php `6 E3 G# z- V
如下所示 行和第 11 行如下:
F: O/ {# T- X' {* ]( becho "My variable value is: " . $my_variable_name;echo "My index value is: " . $my_array["my_index"];
. }7 g$ A3 D( a8 v3 n 这些错误消息的含义是什么?9 U: R' J2 g- u
为什么它们会突然出现?我用这个脚本已经很多年了,我从来没有遇到过任何问题。 S/ m# i6 m# O/ `, ?+ |
如何修复它们?
9 s& b' R% U7 V
' d1 Q5 O$ X- K6 e9 C/ k 解决方案:
1 L6 S% p: K3 O; c$ }. y( F 注:未定义的变量来自PHP 手册的丰富智慧:" `6 t H3 V+ y- ?. I" [
当一个文件包含在另一个使用相同变量名的文件中时,依赖未初始化变量的默认值是有问题的。这也是一个重大的安全风险register_globals的开启。E_NOTICE在使用未初始化变量的情况下级错误,但不会将元素附加到未初始化数组中。isset()语言结构可用于检测变量是否已初始化。此外,更理想的是empty()解决方案,因为如果变量不初始化,就不会产生警告或错误信息。
' j# L$ _" f3 H6 e4 |8 X+ M0 B来自PHP 文档:* x. k( Q$ d" D7 x
如果变量不存在,则不会发出警告。这意味着 empty()本质上是等价的!isset($var) || $var == 假。' w3 @+ S2 l/ M
这意味着你只能用empty()确定变量是否已设置,并根据以下内容检查变量,0、0、0.0,"","0",null,false或[]。, S$ ~5 ~+ S5 Z+ f9 j T% }
例子:
& ?1 v# O' x* N" O7 o8 ]$o = [];@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];array_walk($var,function($v) echo (!isset($v) || $v == false) ? 'true false echo ' ' . (empty($v) ? 'true' : 'false echo "\n";});+ _9 [4 N" [8 M0 i7 H
在3v4l.org 在线 PHP 在编辑器中测试上述代码段6 R5 Z, W2 y: v
尽管 PHP 不需要变量声明,但确实建议这样做,以避免一些安全漏洞或错误,因为人们会忘记将来在脚本中使用的变量赋值。PHP 在不声明变量的情况下所做的是发出一个非常低级的错误,E_NOTICE默认情况下甚至不会报告,但建议在开发过程中允许手册。 X+ n, L7 }; ?7 W3 o, h1 d
处理问题的方法:
8 M: B- X; L6 Q" H[ol]推荐:例如,当您尝试将字符串添加到未定义的变量中时,声明您的变量。或者 在引用它们之前使用isset()/!empty()来检查它们是否已声明,如下所示:[/ol]php //Initializing variable $value = ""; //Initialization value; Examples "" When you want to append stuff later 0 When you want to add numbers later //isset() $value = isset($_POST['value) $_POST['value empty() $value = !empty($_POST['value) $_POST['value ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ `7 f( O, c& _5 B从 PHP 7.从0 开始,它变得更清晰了,现在你可以用了null 合并运算符:
3 R- v9 V% h1 h% f: C9 K0 [& j* Tphp // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value
) v2 f ?3 {6 j1 c+ ]) J) ~[ol]为 E_NOTICE设置自定义错误处理程序,重定向标准输出消息(可能到日志文件):[/ol]php set_error_handler('myHandlerForMinorErrors',E_NOTICE | E_STRICT)
4 x r0 ?- A4 [$ Q[ol]禁用 E_NOTICE 报告E_NOTICE是:[/ol]php error_reporting( error_reporting() & ~E_NOTICE )0 [5 f C+ k9 D0 l. I& O
[ol]使用@ 操作符抑制错误。[/ol]注意:强烈建议只实施第 1 点。' z4 I4 v9 u* x
注:未定义索引/未定义偏移当您(或 PHP)本通知将出现在试图访问数组未定义索引时。$ T7 k% {3 x$ T; c* U' z# W" D
处理问题的方法:
/ A9 w' N2 p5 D/ {2 ?[ol]检查索引是否存在于访问前。为此,您可以使用它isset()或array_key_exists():[/ol]php //isset() $value = isset($array['my_index) $array['my_index array_key_exists() $value = array_key_exists('my_index',$array) ? $array['my_index ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 n& e6 z# V) t Y7 n I X
[ol]语言构造list()在尝试访问不存在的数组索引时,可能会生成此信息:[/ol]php list($a,$b) = array(0 => 'a);or list($one,$two) = explode,test string');" t8 ]& d1 C# \( ]' U9 F
两个变量用于访问两个数组元素,但只有一个数组元素 index因此,这将产生:2 Z0 l- ~! S& C) R: ]
注:未定义的偏移:1
2 p* S# @7 u8 ?4 \) u+ T+ Z7 ]$_POST/ $_GET/$_SESSION可变使用$_POST,$_GET上述注意事项经常出现$_SESSION。对于$_POST和$_GET如果索引存在或不使用它们,你只需要检查一下。$_SESSION一定要保证会话开始session_start()并且索引也存在。 |
|