我试图理解文档中的STD_PROP_LIST常量,但到目前为止我还没有理解它,也没有找到任何解释:(文档中有以下示例:
$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
$a['arr'] = 'array data';
$a->prop = 'prop data';
$b = new ArrayObject();
$b['arr'] = 'array data';
$b->prop = 'prop data';
// ArrayObject Object
// (
// [prop] => prop data
// )
print_r($a);
// ArrayObject Object
// (
// [arr] => array data
// )
print_r($b);两个指纹给了我相同的结果:
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) )
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) )任何人可以帮助我理解使用这个常量和不使用这个常量有什么区别?
提前感谢!
发布于 2013-05-18 07:21:08
ArrayObject和ArrayIterator是两个非常相似的类。它们实际上都在php核心内部共享了大量代码。这两个类有一个内部数组来存储您为这些类设置的元素。
STD_PROP_LIST告诉我们如何读取,而ARRAY_AS_PROPS告诉我们如何编写这些元素。首先,通过标准数组([])表示法设置元素将始终以相同的方式工作,而不管这些设置如何。
当设置ARRAY_AS_PROPS标志时,这意味着当您设置属性(通过->)时,将不会像对常规对象那样在对象上设置,而是将存储为内部元素。如果未设置此标志,它会将属性存储到实际的数组对象或数组迭代器中,这就是您在示例的代码输出中看到的:"prop => propdata“不在storage:ArrayObject:private中,如果设置了ARRAY_AS_PROPS标志,就会出现这种情况:
$a = new ArrayObject();
$a['arr'] = 'array data';
$a->prop = 'prop data';
$b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$b['arr'] = 'array data';
$b->prop = 'prop data';
print_r($a);
print_r($b);
// Output:
ArrayObject Object
(
[prop] => prop data
[storage:ArrayObject:private] => Array
(
[arr] => array data
)
)
ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[arr] => array data
[prop] => prop data
)
)在某些情况下,最明显的是在var_dump()中,STD_PROP_LIST决定返回什么。虽然还会有其他的案例,但我自己还没有找到。如果设置了STD_PROP_LIST,它将返回已在ArrayObject或ArrayIterator类上设置的属性。如果未设置,则var_dump()将返回已存储的内部元素的列表。
在STD_PROP_LIST上,实际文档并不是100%正确的。此标志影响var_dump(),但不影响foreach()。当使用foreach()时,它将始终迭代内部元素,而不是实际的属性,即使设置了STD_PROP_LIST。
这两个标志并不是互斥的:您可以同时设置这两个标志,但这样做意义不大:这意味着属性总是作为内部元素(ARRAY_AS_PROPS)添加,而我们希望通过var_dump (STD_PROP_LIST)返回标准属性。由于无法设置属性,因此在这种情况下,它将始终返回一个空列表。
发布于 2021-11-17 12:02:45
@JayTaph给出了一个很好的答案,但print_r更像是一个调试函数。例如,为了在foreach中实际使用数组,很明显两者有很大的不同:
$a = new ArrayObject();
$a['arr'] = 'array data';
$a->prop = 'prop data';
$b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$b['arr'] = 'array data';
$b->prop = 'prop data';
echo "\$a:<br>\n";
foreach( $a as $key=> $value) {
printf( "[%s] : %s<br>\n", $key, $value);
}
echo "\$b:<br>\n";
foreach ($b as $key => $value) {
printf("[%s] : %s<br>\n", $key, $value);
}将输出:
$a:
[arr] : array data
$b:
[arr] : array data
[prop] : prop datahttps://stackoverflow.com/questions/14610307
复制相似问题