Function Reference >> Other Basic Extensions >> SPL >> Datastructures

本文详细介绍了PHP SPL库中的SplQueue类,包括其构造方法、入队列enqueue、出队列dequeue及设置迭代模式setIteratorMode等核心功能。通过两个实例展示了不同迭代模式下队列的操作效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
// +----------------------------------------------------------------------
// | Function Reference >> Other Basic Extensions >> SPL >> Datastructures
// +----------------------------------------------------------------------
// | SPL >> 数据结构 >> spl队列
// +----------------------------------------------------------------------
// | Author: alexander <gt199899@gmail.com>
// +----------------------------------------------------------------------
// | Datetime: 2017-09-21 16:26
// +----------------------------------------------------------------------
// | Perfect Is Shit
// +----------------------------------------------------------------------

/**
 * SplQueue extends SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
 *  --Methods--
 *      __construct ( void )
 *      mixed dequeue ( void )
 *      void enqueue ( mixed $value )
 *      void setIteratorMode ( int $mode )
 *  --Inherited methods--
 *      public void SplDoublyLinkedList::add ( mixed $index , mixed $newval )
 *      public mixed SplDoublyLinkedList::bottom ( void )
 *      public int SplDoublyLinkedList::count ( void )
 *      public mixed SplDoublyLinkedList::current ( void )
 *      public int SplDoublyLinkedList::getIteratorMode ( void )
 *      public bool SplDoublyLinkedList::isEmpty ( void )
 *      public mixed SplDoublyLinkedList::key ( void )
 *      public void SplDoublyLinkedList::next ( void )
 *      public bool SplDoublyLinkedList::offsetExists ( mixed $index )
 *      public mixed SplDoublyLinkedList::offsetGet ( mixed $index )
 *      public void SplDoublyLinkedList::offsetSet ( mixed $index , mixed $newval )
 *      public void SplDoublyLinkedList::offsetUnset ( mixed $index )
 *      public mixed SplDoublyLinkedList::pop ( void )
 *      public void SplDoublyLinkedList::prev ( void )
 *      public void SplDoublyLinkedList::push ( mixed $value )
 *      public void SplDoublyLinkedList::rewind ( void )
 *      public string SplDoublyLinkedList::serialize ( void )
 *      public void SplDoublyLinkedList::setIteratorMode ( int $mode )
 *      public mixed SplDoublyLinkedList::shift ( void )
 *      public mixed SplDoublyLinkedList::top ( void )
 *      public void SplDoublyLinkedList::unserialize ( string $serialized )
 *      public void SplDoublyLinkedList::unshift ( mixed $value )
 *      public bool SplDoublyLinkedList::valid ( void )
 *  }
 * SplQueue 拥有三个方法,继承自双向链表
 *  dequeue 出队列
 *  enqueue 入队列
 *  setIteratorMode 设置模式,默认:SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP
 *      SplDoublyLinkedList::IT_MODE_FIFO (Stack style) 先进先出
 *      SplDoublyLinkedList::IT_MODE_LIFO (Queue style) 后进先出
 *      SplDoublyLinkedList::IT_MODE_KEEP (Elements are traversed by the iterator) 遍历保留
 *      SplDoublyLinkedList::IT_MODE_DELETE (Elements are deleted by the iterator) 遍历删除
 *  setIteratorMode 设置模式不能设置为后进先出;
 *
 * 注意:仅仅遍历操作 IT_MODE_KEEP 才生效,非遍历操作(比如pop,dequeue等)是直接从队列中取出一个元素,IT_MODE_KEEP 不生效。
 */

namespace case1;

$obj = new \SplQueue();
for ($i = 1; $i <= 10; $i++) {
    $obj->enqueue($i);
}
echo "队列初始长度 : " . $obj->count() . PHP_EOL;
$obj->rewind();
foreach($obj as $v){
    echo "队列遍历 : " . $v . PHP_EOL;
}
echo "队列遍历后长度 : " . $obj->count();

/**
 * 输出:
 * 队列初始长度 : 10
 * 队列遍历 : 1
 * 队列遍历 : 2
 * 队列遍历 : 3
 * 队列遍历 : 4
 * 队列遍历 : 5
 * 队列遍历 : 6
 * 队列遍历 : 7
 * 队列遍历 : 8
 * 队列遍历 : 9
 * 队列遍历 : 10
 * 队列遍历后长度 : 10
 */

namespace case2;

$obj = new \SplQueue();
$obj->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);
for ($i = 1; $i <= 10; $i++) {
    $obj->enqueue($i);
}
echo "队列初始长度 : " . $obj->count() . PHP_EOL;
$obj->rewind();
foreach($obj as $v){
    echo "队列遍历 : " . $v . PHP_EOL;
}
echo "队列遍历后长度 : " . $obj->count();

/**
 * 输出:
 * 队列初始长度 : 10
 * 队列遍历 : 1
 * 队列遍历 : 2
 * 队列遍历 : 3
 * 队列遍历 : 4
 * 队列遍历 : 5
 * 队列遍历 : 6
 * 队列遍历 : 7
 * 队列遍历 : 8
 * 队列遍历 : 9
 * 队列遍历 : 10
 * 队列遍历后长度 : 0
 */
### Maven Packaging `so` 配置 对于Maven项目而言,默认情况下,如果没有特别指定 `<packaging>` 类型,则会采用 `jar` 作为默认值[^1]。然而,在某些特定场景下,可能需要构建共享库文件(Shared Object),即 `.so` 文件,尤其是在开发JNI接口或是其他形式的本地代码集成时。 当设置 `<packaging>so</packaging>` 时,这表明该项目旨在生成动态链接库而非标准Java归档文件。需要注意的是,直接支持 `so` 的打包类型并不是Maven内置的标准选项之一;因此要实现这一点通常涉及自定义生命周期绑定以及利用诸如 `maven-native-plugin` 或者第三方插件来完成实际编译过程中的C/C++源码处理工作。 下面是一个简单的POM片段示例,展示了如何通过配置使Maven能够处理并最终产出`.so`类型的产物: ```xml <project> ... <build> <plugins> <!-- 使用native-maven-plugin来进行本地编译 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>generate-resources</phase> <goals><goal>run</goal></goals> <configuration> <tasks> <mkdir dir="${basedir}/target/classes"/> <copy todir="${basedir}/target/classes"> <fileset dir="src/main/resources"/> </copy> </tasks> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>native-maven-plugin</artifactId> <extensions>true</extensions> <configuration> <source>${basedir}/src/main/native/hello.c</source> <outputDirectory>${project.build.directory}</outputDirectory> <compilerStartOptions> <compilerStartOption>-fPIC</compilerStartOption> </compilerStartOptions> <linkerEndOptions> <linkerEndOption>-shared</linkerEndOption> </linkerEndOptions> </configuration> </plugin> </plugins> </build> <packaging>so</packaging> </project> ``` 上述例子中引入了 `native-maven-plugin` 插件用于执行C语言源程序(`hello.c`)的编译操作,并指定了 `-fPIC` 编译器参数确保位置独立代码(PIC)被创建出来以便于后续制作成共享对象(.so)[^5]。同时设置了 `-shared` 参数给链接阶段告知gcc/GNU Linker我们要建立一个可重定位的目标模块而不是普通的可执行文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值