PHP 使用 CachingIterator 的数组到字符串转换通知
PHP array to string conversion notice with CachingIterator
我已经就此主题在 Whosebug 上进行了一些搜索,但据我所知,我没有将数组视为字符串?
我收到的消息是:
Array to string conversion in X on line 42
我的代码的第 42 行是 foreach
循环的开头:
foreach ($collection as $element) {
变量$collection
是一个基于数据库输出的缓存迭代器:
$collection=new \CachingIterator(new \ArrayIterator($this->dbData));
如果我在$this->dbData
上print_r()
,我肯定得到一个数组:
Array
(
[0] => Array
(
[c_id] => A
)
[1] => Array
(
[c_id] => B
)
所以,总结一下:
- 我们有一个数组的确认输出
- 我们知道
ArrayIterator()
需要一个 array
作为参数
- 我们知道
CachingIterator()
需要一个 Iterator
作为参数
- 我们知道
foreach()
可以遍历 Iterator
TL;DR 我真的不确定我在这里将什么视为字符串?
编辑添加....
即使我大大简化了我的代码,我仍然可以重现:
<?php
error_reporting (E_ALL | E_STRICT);
ini_set ('display_errors', 1);
$arrX=array(array("c_id"=>"A"),array("c_id"=>"B"));
$collection=new \CachingIterator(new \ArrayIterator($arrX));
foreach($collection as $element) {
echo $element["c_id"].PHP_EOL;
}
Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6
A
Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6
B
需要 CachingIterator::FULL_CACHE
<?php
$arrX = array(
array( "c_id" => "A" ),
array( "c_id" => "B" )
);
$collection = new \CachingIterator( new \ArrayIterator( $arrX ), CachingIterator::FULL_CACHE );
foreach( $collection as $element )
{
echo $element["c_id"].PHP_EOL;
}
简短的回答是,您无意中要求 CachingIterator
在迭代期间将子数组转换为字符串。要不这样做,请不要使用 CachingIterator::CALL_TOSTRING
或 CachingIterator::TOSTRING_USE_INNER
标志。
您可以不设置标志,方法是使用 0
作为 $flags
参数的值,或者使用不同的标志:这可以在构造函数中完成,或者在初始化之后使用 CachingIterator::setFlags()
。
例如:
$array = [["c_id" => "A"], ["c_id" => "B"]];
$collection = new CachingIterator(new ArrayIterator($array), 0);
foreach ($collection as $element) {
// no E_NOTICE messages, yay!
}
还有几句解释...
默认情况下,CachingIterator
class 设置 CachingIterator::CALL_TOSTRING
标志,如 PHP manual page on CachingIterator
.
中所述
public __construct ( Iterator $iterator [, int $flags = self::CALL_TOSTRING ] )
当设置此标志(或 CachingIterator::TOSTRING_USE_INNER
标志)并调用 CachingIterator::next()
方法时(即在迭代期间)当前值(在本例中为每个子数组)或内部迭代器(在本例中为 ArrayIterator
)分别转换为字符串并在内部保存。当使用其中一个标志时,此字符串值是从 CachingIterator::__toString()
返回的值。
使用任何其他标志时,调用 CachingIterator::next()
时不会执行上述操作。
我已经就此主题在 Whosebug 上进行了一些搜索,但据我所知,我没有将数组视为字符串?
我收到的消息是:
Array to string conversion in X on line 42
我的代码的第 42 行是 foreach
循环的开头:
foreach ($collection as $element) {
变量$collection
是一个基于数据库输出的缓存迭代器:
$collection=new \CachingIterator(new \ArrayIterator($this->dbData));
如果我在$this->dbData
上print_r()
,我肯定得到一个数组:
Array
(
[0] => Array
(
[c_id] => A
)
[1] => Array
(
[c_id] => B
)
所以,总结一下:
- 我们有一个数组的确认输出
- 我们知道
ArrayIterator()
需要一个array
作为参数 - 我们知道
CachingIterator()
需要一个Iterator
作为参数 - 我们知道
foreach()
可以遍历Iterator
TL;DR 我真的不确定我在这里将什么视为字符串?
编辑添加....
即使我大大简化了我的代码,我仍然可以重现:
<?php
error_reporting (E_ALL | E_STRICT);
ini_set ('display_errors', 1);
$arrX=array(array("c_id"=>"A"),array("c_id"=>"B"));
$collection=new \CachingIterator(new \ArrayIterator($arrX));
foreach($collection as $element) {
echo $element["c_id"].PHP_EOL;
}
Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6
A
Notice: Array to string conversion in /Users/bp/tmp/test.php on line 6
B
CachingIterator::FULL_CACHE
<?php
$arrX = array(
array( "c_id" => "A" ),
array( "c_id" => "B" )
);
$collection = new \CachingIterator( new \ArrayIterator( $arrX ), CachingIterator::FULL_CACHE );
foreach( $collection as $element )
{
echo $element["c_id"].PHP_EOL;
}
简短的回答是,您无意中要求 CachingIterator
在迭代期间将子数组转换为字符串。要不这样做,请不要使用 CachingIterator::CALL_TOSTRING
或 CachingIterator::TOSTRING_USE_INNER
标志。
您可以不设置标志,方法是使用 0
作为 $flags
参数的值,或者使用不同的标志:这可以在构造函数中完成,或者在初始化之后使用 CachingIterator::setFlags()
。
例如:
$array = [["c_id" => "A"], ["c_id" => "B"]];
$collection = new CachingIterator(new ArrayIterator($array), 0);
foreach ($collection as $element) {
// no E_NOTICE messages, yay!
}
还有几句解释...
默认情况下,CachingIterator
class 设置 CachingIterator::CALL_TOSTRING
标志,如 PHP manual page on CachingIterator
.
public __construct ( Iterator $iterator [, int $flags = self::CALL_TOSTRING ] )
当设置此标志(或 CachingIterator::TOSTRING_USE_INNER
标志)并调用 CachingIterator::next()
方法时(即在迭代期间)当前值(在本例中为每个子数组)或内部迭代器(在本例中为 ArrayIterator
)分别转换为字符串并在内部保存。当使用其中一个标志时,此字符串值是从 CachingIterator::__toString()
返回的值。
使用任何其他标志时,调用 CachingIterator::next()
时不会执行上述操作。