非法字符串偏移警告 PHP深入了解

2022-08-30 06:14:48

将我的php版本更新到5.4.0-3后,我收到一个奇怪的PHP错误。

我有这个数组:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

当我尝试像这样访问它时,我收到奇怪的警告

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

我真的不想只是编辑我的php.ini并重新设置错误级别。


答案 1

该错误通常意味着:您尝试使用字符串作为完整数组。Illegal string offset 'whatever' in...

这实际上是可能的,因为字符串能够在php中被视为单个字符的数组。因此,您认为$var是一个带有键的数组,但它只是一个带有标准数字键的字符串,例如:

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

您可以在此处查看实际操作:http://ideone.com/fMhmkR

对于那些来到这个问题上试图将错误的模糊性转化为解决它的事情的人,就像我一样。


答案 2

您正在尝试访问 一个,就好像它是一个数组一样,其键是 . 不会明白的。在代码中,我们可以看到问题:stringstringstring

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

深入了解

让我们看看这个错误:

警告:非法的字符串偏移“端口”在 ...

它说了什么?它表示我们正在尝试将字符串用作字符串的偏移量。喜欢这个:'port'

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

这是什么原因造成的?

由于某种原因,您期望一个 ,但是您有一个 .只是一个混淆。也许你的变量被改变了,也许它从来没有是一个,这真的不重要。arraystringarray

我们能做些什么?

如果我们知道我们应该有一个,我们应该做一些基本的调试,以确定为什么我们没有.如果我们不知道我们是否会有一个 or ,事情就会变得有点棘手。arrayarrayarraystring

我们可以做的是进行各种检查,以确保我们没有通知,警告或错误,例如is_array设置array_key_exists

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

issetarray_key_exists 之间有一些细微的区别。例如,如果 的值为 ,则返回 。 只会检查,好吧,密钥是否存在$array['key']nullissetfalsearray_key_exists


推荐