【发布时间】:2016-01-19 02:35:40
【问题描述】:
<?php
$stack = new SplStack();
$stack->add(0, 'one');
$stack->add(1, 'two');
$stack->add(2, '2015');
echo "<pre>";
print_r($stack);
当我运行此代码时,所有项目都存储一个名为dllist(我希望)的属性,这是预期的结果。
SplStack Object
(
[flags:SplDoublyLinkedList:private] => 6
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => one
[1] => two
[2] => 2015
)
)
但是我运行下面的代码,工作方式与上面的代码相同,为什么当我尝试时,$stack[] = 'one'; 为什么没有出错? php如何知道$stack[] = 'one';应该存储在dllist中?
<?php
$stack = new SplStack();
$stack[] = 'one';
$stack[] = 2015;
$stack[] = 'two';
echo "<pre>";
print_r($stack);
我预计会出现类似以下语句的错误:
<?php
$int = 2015;
$int[] = 300; //Warning: Cannot use a scalar value as an array in
$str = 'foo';
$str[] = 'foo'; //Fatal error: [] operator not supported for strings in
$obj = new stdClass();
$obj[] = 'new one'; //Fatal error: Cannot use object of type stdClass as array in
【问题讨论】:
-
因为堆栈不仅仅是一个替代数组,它是一个非常特殊的 FILO(先进后出)数据结构。虽然它可能与数组共享一些功能,但它应该用作堆栈,而不仅仅是数组
-
@MarkBaker,这个
$stack[] = 'one';工作是因为SplStack 实现了arrayAcess? -
是的,但是
$stack[] = 'one';等效于$stack->push('one'),而不是$stack->add(0, 'one');.... 后者是专门为在dll 内的固定点注入值而实现的,将剩余部分改组堆栈的必要性....并且使用 push 效率更高,除非您需要操作堆栈中已经存在的值 -
提问有什么问题?