请稍等...页面即将加载完成
PHP的SPL标准库的一点学习
一晃就2011年了,好快,三天假真是没什么过的,啥事还没做就没了。1号早上爬起来一看阳光不错,就去爬山,tnn的梧桐山,真是高。前两次都去的是南山,这次终于换了难度高的,之前就听说是深圳最高的山。一路沿溪而上,mq一路失足(听说国家发布说要称妓女为失足妇女),lup也不怎么好,差点把牙个摔没了,shixf还要好点,貌似没的啥问题,估计是去过一次摔出经验了。失误我竟然也掉了一只脚。
今天在家闲来无事,有点冷就没去公司加班了,索性看了一下上次老大提到的php的spl库。学习了一下,还行,就是php内置的一些类。目前来说没有发现有多高级的地方,不过还是有一些想法,不知道怎么说,等到哪天有用的时候就好了。贴一下代码:
View Code PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | $a = array('a','b', 'c'); /** * Iterator是迭代器,它包含5个必须实现的方法:current、key、rewind、valid、next */ class cArray implements Iterator{ private $_array; private $_valid; function __construct($arr){ $this->_array = $arr; } /** * 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE。 * @return unknown */ function current(){ return current($this->_array); } /** * 返回数组中当前单元的键名。 * @return unknown */ function key(){ return key($this->_array); } /** * 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值,如果数组为空则返回 FALSE。 */ function rewind(){ $this->_valid = (FALSE !== reset($this->_array)); } /** * 返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE。 */ function next(){ $this->_valid = (FALSE !== next($this->_array)); } /** * 返回当前值是否valid * @return unknown */ function valid(){ return $this->_valid; } } $c = new cArray($a); foreach ($c as $k => $v) { echo $k.'->'.$v.'<br />'; } $c->rewind(); while ($c->valid()) { echo $c->key().'->'.$c->current().'<br />'; $c->next(); } /** * ArrayAccess 其功能是使类可以像PHP中的数组一样操作。需要实现以下方法:offsetExists($offset)、offsetGet($offset)、offsetSet($offset, $value)、offsetUnset($offset) * */ class article implements ArrayAccess{ public $c_title; public $c_content; function __construct($title, $content){ $this->c_title = $title; $this->c_content = $content; } function offsetExists($key){ return array_key_exists('c_'.$key, get_object_vars($this)); } function offsetGet($key){ return array_key_exists('c_'.$key, get_object_vars($this)) ? $this->{'c_'.$key} : 'undefined'; } function offsetSet($key, $value){ return array_key_exists('c_'.$key, get_object_vars($this)) ? $this->{'c_'.$key} = $value : 'undefined'; } function offsetUnset($key){ if(array_key_exists('c_'.$key, get_object_vars($this))){ unset($this->{'c_'.$key}); } } } $aa = new article('我是', '会说话的狗'); $aa['title'] = '我才是'; var_dump($aa); foreach ($aa as $k => $v) { echo $k.'=>'.$v.'<br />'; } $aaa = new ArrayObject($a); $aaa->append('d'); for ($iterator = $aaa->getIterator(); $iterator->valid(); $iterator->next()) { echo $iterator->current().'_'.$iterator->count(); } //ArrayIterator类和ArrayObject类,只支持遍历一维数组。如果要遍历多维数组,必须先用RecursiveIteratorIterator生成一个Iterator,然后再对这个Iterator使用RecursiveIteratorIterator。 $a_bak = array($a, $a, $a); foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($a_bak)) as $k => $v) { echo $k.'<==>'.$v.'<br />'; } try{ /*这个类用来查看一个目录中的所有文件和子目录,__construct ($path) __toString ()、 current ()、 getATime ()、 getCTime () 、getFileInfo (string class_name=NULL) 、getFilename () getGroup () 、getInode () 、getLinkTarget () 、getMTime () 、getOwner () 、getPath () 、getPathInfo (string class_name=NULL) getPathname () 、getPerms () 、getRealPath () 、getSize () 、getType () 、isDir () 、isDot () 、isExecutable () 、isFile () isLink () 、isReadable () 、isWritable () 、key () 、next () 、openFile ($mode= 'r', $use_include_path=false, $context=NULL) rewind () 、setFileClass (string class_name="SplFileObject")、setInfoClass (string class_name="SplFileInfo") 、valid () */ foreach (new DirectoryIterator('./') as $k => $v) { echo $v->getFilename().'_'.$v->getSize().'<br />'; } }catch (Exception $e){ echo $e; } //FilterIterator类可以对元素进行过滤,只要在accept()方法中设置过滤条件就可以了。 //下面是一个获取质数的类 class primeFilter extends FilterIterator{ function __construct($it){ parent::__construct($it); } function accept(){ if($this->current() % 2 != 1){ return false; } $d = 3; $x = sqrt($this->current()); while ($this->current() % $d != 0 && $d < $x) { $d += 2; } return (($this->current() % $d == 0 && $this->current() != $d) * 1) == 0 ? true : false; } } $numbers = range(212345,212456); $primes = new primeFilter(new ArrayIterator($numbers)); foreach ($primes as $v) { echo $v.' is primes'; } |
我怕有人是来看代码的,结果我瞎掰活爬山的事。继续说: 上去的时候还好,因为我本身很喜欢跑,属于身子骨很灵活的那类,几乎是水上漂级别。估计是鞋没穿好:平底板鞋,结果下山的时候不行了,一步都动不了,两脚板跟走过刀山似的锥心的痛。从来没有那么衰过,到山脚下一看那场面,排队等公交车的人足足搞了好几百米的一条长龙。排了少许,折腾不过,来个面的每人30拔起来就跑,这一天花了接近100.昨天啥事没做,家门都没迈,在床上躺了一天——养脚。
好了,马上又快00点了,睡觉。
上一篇: 明天到了,明年就到了
下一篇: JavaScript闭包-如此美的代码
