很抱歉,如果这是一个令人恼火的问题(我来自红宝石背景,我是PHP的新手)。
我发现你不能这样做有点奇怪:
if($defined_array['undefined_index'] == 'a string') {
do_something();
}
没有被警告抨击。
false
会更有意义。是否由于口译员的限制?这背后的技术原因是什么?我很好奇。是否有任何我不知道的函数,构造,习语或其他任何东西会避免我每4行左右这样做:
if(isset($defined_array['undefined_index']) && $defined_array['undefined_index'] == 'a string') {
do_something();
}
我知道我可以声明我打算使用的每一个数组键,但是如果PHP打算在你每次使用它时打击你,那么在使用它们之前不要强制声明变量是什么意思?
答案 0 :(得分:3)
警告的原因是出于代码安全原因。虽然数组键不存在的原因可能是因为在这种情况下没有提供它,但是在设置或检索元素时也可能存在拼写错误。如果没有警告,就很难注意到这种编码错误。
答案 1 :(得分:2)
不,没有相同的表达方式。但是,您可以创建自己的比较函数或使用(绝对可怕的)错误抑制运算符@。错误抑制总是一个坏主意,我建议你改为解决问题。
1:自己的功能:
function setAndEq($a, $b){
if(isset($a, $b))
return $a === $b;
else
return false;
}
if(setAndEq($array['undefined_index'], "hello")) {
// hello
}
2:错误抑制:
if(@strcmp($array['undefined_index'], "hello") === 0) {
}
答案 2 :(得分:1)
这取决于,首先你可以转换你的error_reporting,但我不会推荐你。
当您对同一个数组键进行多次检查时,您也可以尝试这样做:
if (isset($defined_array['undefined_index'])) :
switch ($defined_array['undefined_index']) :
case 'a string' :
do_something();
break;
case 'b string' :
do_anotherthing();
break;
endswitch;
endif;
在这种情况下,您不必担心每一行的所有警告。
答案 3 :(得分:1)
您可以通过设置适当的错误级别来消除警告,但这不是一个好主意。我个人使用一个小功能来轻松打字:
/**
* nullsafe
*
* returns values from array like objects
*
* Usage:
* nullsafe($array, 'key'); - returns the $array['key'] if it is set
* nullsafe($array, 'key', 'foo'); - returns the $array['key'] if it is set, 'foo' otherwise
* nullsage($array, array('level0', 'level1')); returns $array['level0']['level1'] if it is set, null otherwise
*
* returns value indexed by $key from the $from, or the $default if its not present
* if the key is an array then it will descend it into the $from like $from[$key[0]][$key[1]][$key[2]]...
*
* @param mixed $from
* @param mixed $key
* @param mixed $default
* @return mixed
*/
function nullsafe($from, $key, $default = null) {
if (!is_array($key)) {
if (isset($from[$key])) {
return $from[$key];
}
} else {
foreach ($key as $k) {
if (!isset($from[$k])) {
return $default;
} else {
$from = $from[$k];
}
}
return $from;
}
return $default;
}
答案 4 :(得分:1)
关于1: 当变量不存在时,您应该始终收到警告。它表示您没有正确编写代码。当未设置的变量(或数组键)评估为FALSE时,这将是错误的。 我想问题不在于技术原因 - 它只是常识。
关于2:
不。只需使用empty()
或isset()
并使用严格的类型检查.. p.e. if ($x === FALSE)
代替if ($x == NULL)
。
答案 5 :(得分:0)
修改:合并isset和error control operator您可以声明一个始终返回变量值的函数,如果未设置,则声明null
:
$ php -a
Interactive shell
php > function getvalue($var) {
php { return isset($var) ? $var: null;
php { }
php > $testarray['key1'] = "hello";
php > if ($myvar = @getvalue($testarray['key1'])) echo "var: " . $myvar;
var: hello
php > if ($myvar = @getvalue($testarray['key2'])) echo "var: " . $myvar;
php >
请注意,您无法区分不存在的变量或变量但变量值为null
的变量。