PHP头条
热点:

ArrayObject – 对数组的封装

PHP有个称作SPL的标准库,其中包含了个叫做ArrayObject的类,它能提供“像数组一 样操作类”的功能,例如

  1. $res = new ArrayObject(array(10, 20, 30, 40));foreach ($res as $v) {  
  2.    echo "$vn";} 

ArrayObject是个内置的类,所以你可以像其他类类操作一样封装它。

Arr - 包上糖衣

既然我们已经有了ArrayObject以及闭包这些特性,我们就可以开始尝试封装它:

  1. class Arr extends ArrayObject  
  2. {      
  3. static function make($array)      
  4. {          
  5. return new self($array);      
  6. }    function map($func)      
  7. {          
  8. $res = new self();          
  9. foreach ($this as $k => $v)   
  10. {              
  11. $res[$k] = $func($k, $v);          
  12. }          
  13. return $res;      
  14. }      
  15. function filter($func)      
  16. {          
  17. $res = new self();         
  18.  foreach ($this as $k => $v)   
  19. {              
  20. if ($func($k, $v))   
  21. {                  
  22. $res[$k] = $v;             
  23.  }          
  24.  
  25. }          
  26.  
  27. return $res;      
  28. }  

好了,万事俱备。下面重写的PHP代码就可以解决上面提到的问题,并且看起来语法上“差 不多”了:

  1. $res = Arr::make($nums)      
  2. ->filter(function($k, $v) { return $v > 15; })      
  3. ->map(function($k, $v) { return $v * 2; }); 

上面的代码与传统方式有何不同呢?首先,它们可以递归并形成作用链式的调用,因此可以 添加更多的类似操作。同时,可以通过回调的两个参数分别操作数组的键以及值其项 - $k 对应键以及 $v 对应值 。这使得我们可以在闭包中使用键值,这在传统的PHP函数 array_fliter中是无法实现的。

另外个带来的额外好处就是更加一致API调用。使用传统的 PHP 函数操作,它们有可能第一个参数是个闭包,或者是个数组,抑或是多个数组…总之谁知道呢?这里是 Arr 类的完整源代码,还包含了其他有用的函数类似 reduce 以及 walk),其实它 们的实现其实方式和代码类似。


www.phpzy.comtrue/php/10566.htmlTechArticleArrayObject 对数组的封装 PHP有个称作SPL的标准库,其中包含了个叫做ArrayObject的类,它能提供像数组一 样操作类的功能,例如 $ res = new ArrayObject(array(10,20,...

相关文章

相关频道:

PHP之友评论

今天推荐