©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.3.0)
The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list.
$value
)$mode
)$index
, mixed $newval
)$index
)$index
)$index
, mixed $newval
)$index
)$value
)$mode
)$serialized
)$value
)[#1] MrStonedOne [2014-12-31 04:49:15]
You can use shift/unshift and push/pop to dequeue/undequeue and queue/unqueue respectively. Really handy for those applications that use sockets where you might not know you can't send data until you attempt to.
for example, this is a function for an application that will un-dequeue the remainder of the data if socket_write indicated it did not write the entire contents of the provided data.
<?php
function processSendQueue($socket, $sendQueue) {
while (!$sendQueue->isEmpty()) {
//shift() is the same as dequeue()
$senditem = $sendQueue->shift();
//returns the number of bytes written.
$rtn = socket_write($socket, $senditem);
if ($rtn === false) {
$sendQueue->unshift($senditem);
throw new exception("send error: " . socket_last_error($socket));
return;
}
if ($rtn < strlen($senditem) {
$sendQueue->unshift(substr($senditem, $rtn);
break;
}
}
}
?>
[#2] Manu Manjunath [2014-02-10 10:56:42]
SplQueue inherits from SplDoublyLinkedList. So, objects of SplQueue support methods push() and pop(). But please be advised that if you use push() and pop() methods on a SplQueue object, it behaves like a stack rather than a queue.
For example:
$q = new SplQueue();
$q->push(1);
$q->push(2);
$q->push(3);
$q->pop();
print_r($q);
Above code returns:
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => 1
[1] => 2
)
)
Note that 3 got popped and *not* 1.
So, please make sure that you use only enqueue() and dequeue() methods on a SplQueue object and *not* push() and pop().