当前位置: 首页 > 后端技术 > PHP

PHP完全面向对象的Array和String编程

时间:2023-03-30 00:36:36 PHP

在PHP语言中,一般使用str_*和array_*系列函数来操作字符串和数组。由于历史原因,这些函数的命名和参数顺序风格不一致,被广泛开发。被批评者批评,PHP语言标准库中并没有提供OO风格的Array和String类库。开发者使用不是很方便。在Swoole中,我们提供了一个swoole_array和swoole_string用于面向对象的字符串和数组操作的封装。数组和字符串编程可以完全面向对象的风格来完成。Swoole工程使用方法:非Swoole工程可以直接使用,使用composerrequireswoole/library引入大部分方法提供链式风格支持,一路使用->写逻辑即可。底层类库使用declare(strict_types=1)强类型,在使用phpstorm工具时,可以实现全自动提示和自动补全。创建一个数组$array1=swoole_array(['hello','world']);$array2=swoole_array(['hello'=>1,'world'=>2]);$array3=swoole_array_list('你好','世界','swoole','php');创建字符串//字节字符串$string1=swoole_string('helloworld,phpjava,swoole');//宽字符串$string2=swoole_mbstring('我是中国人');//返回5$string2->length();获取元素//获取$value1=$array1->get(0);$value2=$array2->get('hello');//数组第一个元素$first=$array->first();//数组最后一个元素$last=$array->last();增加/设置//设置$array1->set(0,'swoole');$array2->set('world',9);//追加$array1->pushBack('java');//插入$array1->pushFront('go');//插入$array1->insert(2,'rust')在中间的偏移量2处;连续附加$array1->append('rust')->append('c++')->append('swift','kotlin');$array2->set('rust',99)->set('c++',88)->set('kotlin',77);delete//按键删除$array1->delete(0);$array2->delete('worker');//按值删除$array1->remove('hello');Include使用contains()方法确定数组或字符串是否包含元素。$array1->contains('java');$string1->contains('php');使用startsWith()和endsWith()方法判断字符串的开头和结尾是否为指定值。$str=swoole_string('php和swoole');$str->startsWith('php');//真$str->startsWith('java');//假$str->endsWith('swoole');//真$str->endsWith('golang');//falsesearch//查找数组中是否有值,如果存在则返回其key$key=$array1->search('java');使用String可以与Array结合使用。$s='11,33,22,44,12,32,55,23,19,23';$data=swoole_string($s)->split(',')->each(fn(&$item)=>$item=intval($item))/*<7.4:function(&$item){$item=intval($item);}*/->sort()->unique()->join('-')->contains('-44-');变量转储($数据);首先根据split构造一个string对象,split成array遍历并应用$fn函数将元素转化为整数排序去重Array元素使用-组合成一个string,判断string对象是否包含-44-类型推断。对swoole_array对象元素进行操作时,底层会自动判断其类型。如果是数组或者字符串,底层会递归封装。$array=swoole_array_list(['hello'=>'swoole']);$array->get(0)->get('hello')->contains('swoole');性能测试的底层实现其实是基于str_和array_相关函数进行面向对象的封装,没有太多的性能损失,只有一个方法调用的开销。我们对每个API都编写了严格的单元测试覆盖率,以确保其可靠性。从性能上来说,使用String::contains()执行100万次与直接运行phpstrpos差别不大。swoole_string:0.059892892837524s,php_string:0.033510208129883s源代码GitHub:https://github.com/swoole/library如果您对这个项目感兴趣,可以参与我们的开发工作,期待您的PullRequest。