Spl,ArrayObject,ArrayObject :: STD_PROP_LIST

Fri*_*urf 22 php spl arrayobject

我试图在文档中理解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);
Run Code Online (Sandbox Code Playgroud)

两种印刷品都给我相同的结果:

ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] =>      array data ) ) 
ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) )
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我理解使用这个常数之间的区别是什么?

提前致谢!

Jay*_*aph 68

ArrayObjectArrayIterator是2类,真的相似.它们实际上都在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
        )
)
Run Code Online (Sandbox Code Playgroud)

STD_PROP_LIST什么返回在一定条件下,最显着的决定var_dump().虽然还有其他案例,但我自己并没有找到它们.如果STD_PROP_LIST设置了,它将返回已设置到您ArrayObjectArrayIterator类上的属性.如果未设置,则var_dump()返回已存储的内部元素的列表.

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

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

  • 您应该将此答案放在PHP文档注释中,因为它澄清了很多关于ArrayObject标志的内容.即使在文档中我也没有找到这种解释.非常感谢! (8认同)