PHP SPL 标准库

SPL是用于解决典型问题的一组接口与类的集合。在PHP5.3.0以后成为了PHP内核组件的一部份。

一、SPL数据结构(结构数据里可放任意类型数据)
     
     1、双向链表接口SplDoublyLinkedList
$dbLink = new SplDoublyLinkedList();
$dbLink->unshift('张三');
$dbLink->unshift(array('李四'));
$dbLink->pop();
print_r($dbLink);

          派生类:
                   栈 SplStack
                   队列 SplQueue:添加了dequeue出队方法、enquenue入队方法
                         
$queue = new SplQueue();
$queue->enqueue('张三');
$queue->enqueue('李四');
$queue->dequeue();
print_r($queue);

     2、堆
          堆是一种特殊的二叉完全树。堆的一个主要特点是它以一定的偏序(a partial order)来保存所有节点[译者注:此处的偏序是指不完全的排序,堆只需要满足父节点大于两个子节点,而子节点之间没有要求]。作为一颗完全树,一层中的节点是从左到右填满的。如果一个节点没有左儿子,那么它一定没有右儿子。并且在第h层中如果存在节点,那么第h-1层必须是填满的。堆有两种:最大堆和最小堆。最小堆中每个节点的优先级小于或者等于它的子节点;最大堆则相反,每个节点的优先级都大于或者等于它的子节点。图示最大堆(左)和最小堆(右):
     
          SplHeap是一个抽象类,必须实现里面的compare方法,如果第一个参数比第二个参数大则返回1,反之则返回-1,相等则返回0
          示例:
               
class people extends Splheap
{
      public function compare($arr1,$arr2)
      {
            if($arr1['age']>$arr2['age'])
            {
                 return 1;
            }
            else if($arr1['age']==$arr2['age'])
            {
                return 0;
            }
            else
            {
                 return -1;
            }
     }
}

$peopleHeap = new people();

$people1 = array('name'=>'张三','age'=>22);
$people2 = array('name'=>'李四','age'=>25);
$people3 = array('name'=>'王五','age'=>18);
$people4 = array('name'=>'赵六','age'=>30);

$peopleHeap->insert($people1);
$peopleHeap->insert($people2);
$peopleHeap->insert($people3);
$peopleHeap->insert($people4);

               结果如下:注意看,这里并不是所有顺序按从大到小的,最大堆只需要满足父节点大于两个子节点。二茶树图片如下
               
          
               
          派生类
               SplMinHeap 自己实现了一个compare方法
               SplMaxHeap 自己实现了一个compare方法
          很遗憾目前还不知堆在实际应用中用在什么地方,汗...
               
     3、陈列                
               固定数组 SplFixedArray 
                    示例:
                         
$fixArr = new SplFixedArray(3);
$fixArr[0]='a';
$fixArr[1]='b';
$fixArr[2]='2';
//$fixArr[3]='e';#抛出RuntimeException异常

$fixArr->setSize(4);#重新扩大长度
$fixArr[3]='e';#扩大后不再报异常

     4、映射
               SplObjectStorage提供了类似JAVA的map特性,但是这里只能放对象,虽然数组也能实现一些功能,但是使用映射更得心应手。
               部分方法说明:
                    attach(object) 加入对象
                    contains(object) 返回对象是否在map中
                    detach(object) 删除map中的该对象
                    current(void)     当前位置对象     
                    valid(void)     当前位置数值是否有效,常配置next用在遍历上
               注意,attach对象到映射中时,映射中记录的是该对象的地址,因此对象发生改变后,映射中的对象也会随之改变
               示例:
                    
$storage = new SplObjectStorage();

$people1 = new stdClass;
$people2 = new stdClass;
$people3 = new stdClass;


$storage->attach($people1);
$storage->attach($people2);
$storage->attach($people3);

$people1->name = "张三";

print_r($storage);
var_dump($storage->contains($people1));

                    
二、SPL 接口
     1、Countable 实现该接口的类可以被用于count()函数
          必须实现里面的抽象方法public count(void);
     2、OuterIterator 实现该接口的类可以被用于循环foreach
          必须实现抽象方法:current,key,next,rewind,valid
     3、RecursiveIterator和上面的OuterIterator一样
     4、SeekableIterator 实现该接口的类可以使用seek,next,rewind,valid,current,当然你必须实现这几个方法
     感觉:项目中感觉用到的不多。
三、SPL 函数
     1、class_parents 返回指定类的父类,成功返回一个数组,失败返回FALSE
     2、与autoload相关函数
           我们知道__autoload魔术方法,在使用不存在的类时会自动先调用该方法,而SPL提供的函数可以更加细致。
          a、 __autoload是当类不存在时自动调用的一个魔术函数,无法做到算定义函数或类,这时你可以使用spl_autoload_register('my_func_name') 注册一个函数名 ,也可以注册一个类中的方法spl_autoload_register(array(‘class_name','method_name')); 我们可以同时注册多个函数或类中某方法到autoload_functions链表中,如果依然不存在类会依次调用队列中注册的方法。
          b、使用spl_autoload_extensions与spl_autoload的配合
               spl_autoload_extensions('class.php');#这里有多个可以用都好隔开
               spl_autoload('Controller');
               #此时系统会自动将类名Controller转为全小写然后拼上扩展名去包含路径中查找。
           
四、各种类及接口
     1、ArrayObject
          继承它类中的成员就相当于一个数组元素了,比如正常是$obj->name,你可以这样使用$obj['name'],你也可以遍历、count等等像数组一样的操作,很多框架用到了这个类
     2、SplObserver 与 SplSubject 是为便于实现观察者模式出现的。
               SplSubject 中必须实现三个抽象方法 attach、detach、nofity
               SplObserver 中必须实现update方法
五、SPLType 类
     有了它,你就可以限制PHP变量的类型了,这玩意感觉在项目中不太适用,浪费性能,它的原理也很简单,就是在类中__set的时候判断下类型,如果类型不正确就throw new 一个异常
     SplInt           整型
     SplFloat       浮点型
     SplEnum      枚举  ,其实就是在类中定义多个public static const 成员常量而已。     
     SplBool        布尔型
     SplString      字符串 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值