gpt4 book ai didi

php - Spl、ArrayObject、ArrayObject::STD_PROP_LIST

转载 作者:IT王子 更新时间:2023-10-28 23:51:01 27 4
gpt4 key购买 nike

我试图理解文档中的 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 ) )

任何人都可以帮助我理解使用这个常量有什么区别?

提前致谢!

最佳答案

ArrayObjectArrayIterator 是两个非常相似的类。他们实际上都在 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
)
)

STD_PROP_LIST 决定在特定条件下返回什么,尤其是在 var_dump() 中。虽然会有其他情况,但我自己还没有找到。如果设置了 STD_PROP_LIST,它将返回已设置到您的 ArrayObjectArrayIterator 类的属性。如果未设置,则 var_dump() 将返回已存储的内部元素列表。

STD_PROP_LIST 上的实际文档并非 100% 正确。此标志影响 var_dump(),但不影响 foreach()。使用 foreach() 时,它将始终迭代内部元素,而不是实际属性,即使已设置 STD_PROP_LIST 也是如此。

这两个标志并不相互排斥:您可以同时设置这两个标志,但这样做没有多大意义:这意味着属性总是作为内部元素添加 (ARRAY_AS_PROPS),并且我们想通过 var_dump (STD_PROP_LIST) 返回标准属性。由于无法设置属性,因此在这种情况下它将始终返回一个空列表。

关于php - Spl、ArrayObject、ArrayObject::STD_PROP_LIST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com