PHP中的SPL标准类库扩展 (一) 基础知识总结

来源:互联网 发布:电脑音乐合成器软件 编辑:程序博客网 时间:2024/05/22 06:51

摘自 http://www.imooc.com/learn/150


一、SPL标准类库
 1.课程概述
  (1) 什么是SPL
  (2)SPL的基本框架
  (3)SPL的常用数据结构
  (4)SPL的常用迭代器
  (5)SPL的接口
  (6)SPL函数的使用
  (7)SPL的文件处理类库
 2.什么是SPL
 --数学建模/数据结构
    解决数据怎么存储的问题
 --元素遍历
    数据怎么查看的问题
 --常用方法的统一调用
    通用方法(数据、集合的大小)
    自定义遍历
 --类定义自动装载
  让PHP程序适应大型项目的管理要求,把功能的实现分散到不同文件中
  3.SPL的基本框架
  数据结构--基础接口--基础函数--迭代器--异常--其他
二、SPL的常用数据结构


 1-1.什么是数据结构
  --数据结构是计算机存储、组织数据的方式。数据结构是数据之前存在


一种或多种特定关系的数据元素的集合
  -- 解决的是软件开发中数据如何存储的问题 
 1-2.SPL提供哪些数据结构
 --双向链表、堆栈、队列、堆、降序堆、升序堆、优先级队列、定义数组


、对象容器
 2-1双向链表
   --基本概念
   Bottom:最先添加到链表中的节点叫Bottom(底部),也可以成为头部


(head)
  Top:最后添加到链表中的节点叫Top(顶部)(尾部)
  链表指针:是一个当前关注的节点的标识,可以指向任意节点
  当前节点:链表指针指向的节点称为当前节点
  节点名称:可以在链表中唯一标识一个节点的名称,我们称谓节点的key


或者offset
  节点数据:存放在链表中的应用数据,我们通常称之为value
 2-2 SplDoublyLinkedList类操作
  -- 当前节点操作:rewind(返回当前指针头部)、current(返回当前指针)


、next(返回指针下一个)、prev(返回指针上一个)
  -- 添加节点操作:push、unshift  
 --删除节点操作:pop、shift
 --定位操作:bottom、top
 --特定节点操作:offsetExists、offsetGet、offsetSet、offsetUnset
3-1堆栈--继承自SqlDoublyLinkedList的SqlStack类 
 操作
  --push:压入堆栈(存入)
  --pop:退出堆栈(取出)


三、SPL的常用迭代器
  1-1PHP中的迭代器是通过Iterator接口定义的
  -- current():mixed
  -- key():scalar
  -- next():void
  -- rewind():void
  -- valid:bool
 2-1ArrayIterator迭代器
  $it = new ArrayObejct($array);
 3-1AppendIterator
  $it = new AppendIterator();
  $it = append($array);
 4-1MultipleIterator迭代器
  $mit = new MultipleIterato(MultipleIterator::MIT_KEYS_ASSOC);
  $mit->attachIterator($idIter, 'ID');
  $mit->attachIterator($nameIter, 'NAME');
 5-1FileSystemIterator迭代器
  //遍历当前所有文件 
  date_default_timezone_set('PRC');
  $fileIter = new FileSystemIterator('.');
  foreach($fileIter as $value){
    sprintf("%s\t%s\t%8s\t%s\n",
       date('Y-m-d H:i:s',$fileIter->getMTime()),
       $fileIter->isDir()?"<DIR>":"",
       number_famat($fileIter->getSize()),
       $fileIter->getFileName()     
      );
  }
四、SQL基础接口
 1.常用接口
   -Countable 继承了该接口的类可以直接电泳count()得到元素个数
   class MyCount implements Countable{
    protected $_count = 3;
    public function count(){
      return $this->_count;
    }
   }
    $obj = new MyCount();
    echo count($obj);
 2.OuterIterator 如果想对迭代器进行一定的处理之后再返回,可以用这个


接口
    如果想对迭代器进行一定的处理再返回,可以使用这个接


口,IteratorIterator类是OuterIterator的实现,扩展的时候可以直接继承


IteratorIterator
 class OuterImp extends IteratorIterator{
    public function current(){
      return parent::current() . '_current';
   }
    public function key(){
      return parent::key(). '_key';
  }
 }
   $outerObj = new OuterImp(new ArrayIterator($array));
 3.RecursiveIterator 可以对多层结构的迭代器进行迭代,比如一棵树
   所有具有层次接口特点的数据都可以使用这个接口遍历
  关键方法:
    hasChildren方法用于判断当前节点是否存在子节点
   getChildren方法用于得到当前节点子节点的迭代器
 SPL中实现该接口的类
   --RecursiveArrayIterator,RecusiveCachingIterator等以Recusive开头


的类都能进行多层次结构化的遍历


4.SeekableIterator 可用通过seek方法定位集合里面的特定元素
  seek方法的参数是元素的位置,从0开始计算
--SPL中实现该接口的类有:AarrayIterator、DirectoryIterator、


FileSystemIterator、GlobIterator、RecusiveArrayIterator、


RecusiveDirectoryIterator
五、SPL函数的使用


 1.SPL使用spl_autoload_register装载类
  spl_autoload_extendsions('.php');
  set_include_path(get_include_path().PATH_SEPARATOR.'libs/');
  spl_autoload_register();
  new Demo();
  2.使用__autoload方法加载类
  function __autoload($class_name){
    require_once('lbs/'.$class_name.'.php');
  }
 function autoload($class_name){ 
    requre_once('libs/'.$class_name.'.php');
  }
  spl_autoload_register(autoload);
  new Test();
  3.SPL通过自定义的__autoload函数加载类
  function autoload($class_name){ 
    set_include_path('libs/');
    spl_autoload($class_name); 当我们不用reuqire或reuquire_once载


入类文件的时候,必须显示调用spl_autoload函数,参数是类的名称
  }
  spl_autoload_register(autoload);
  new Test();
4.SPL其他函数
 迭代器相关函数
  1. iterator_apply为迭代器中每个元素调用一个用户自定义函数
  2.iterator_count计算迭代器元素的个数
  3.iterator_to_array将迭代器的元素拷贝到数组
 类信息相关函数
  1.class_implements 返回指定的类实现的所有接口
     可以用instanceof语句判断某个对象是否实现了某个接口的或者是某


个类的实例
 2.class_parents返回指定累的父类
  如果继承了多次,会把所有的父类打印出来
六、SPL的文件处理类库
  date_default_timezonoe_set('PRC');
  $file = new SplFileInfo('tmp.txt');
  $file->getCTime();//文件创建时间
  $file->getMTime();//文件修改时间
  $file->getSize();//文件大小
//读取文件里面的内容
 $fileObj = $file->openFile('r');
  while($fileObj->valid()){
  echo  $fileObj->fgets(); 
}
$fileObj = null; //关闭打开的文件
$file = null;




原创粉丝点击