PHP8的 Array 和 String 编程
在 PHP 语言中操作字符串和数组一般使用 str_* 和 array_* 的系列函数,这些函数由于历史原因,命名和参数顺序风格不统一,广为开发者诟病,PHP 语言标准库中暂未提供 OO 风格的 Array 和 String 类库,开发者使用起来不是很便利,在 Swoole 中我们提供了一 swoole_array 和 swoole_string 对字符串和数组操作进行了面向对象封装,可以使用完全面向对象风格进行 Array 和 String 编程。
使用方法
- Swoole 项目:可直接使用
- 非 Swoole 项目,使用 composer require swoole/library 引入
绝大部分方法提供了链式风格支持,可以一路使用 -> 编写逻辑。底层类库使用了 declare(strict_types=1) 强类型,使用 phpstorm 工具时,可以实现完全自动提示和自动完成。

创建数组
$array1 = swoole_array(['hello', 'world']);
$array2 = swoole_array(['hello' => 1, 'world' => 2]);
$array3 = swoole_array_list('hello', 'world', 'swoole', 'php');
创建字符串
// Bytes 字符串
$string1 = swoole_string('hello world, php java, 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');
// 在中间 offset 2 插入
$array1->insert(2, 'rust');
连续追加
$array1->append('rust')->append('c++')->append('swift', 'kotlin');
$array2->set('rust', 99)->set('c++', 88)->set('kotlin', 77);
删除
// 按 key 删除
$array1->delete(0);
$array2->delete('worker');
// 按 value 删除
$array1->remove('hello');
包含
使用contains()方法可以判断数组或字符串中是否包含某个元素。
$array1->contains('java');
$string1->contains('php');
使用startsWith()和endsWith()方法判断字符串开头和结尾是否为指定的值。
$str = swoole_string('php and swoole');
$str->startsWith('php'); //true
$str->startsWith('java'); //false
$str->endsWith('swoole'); //true
$str->endsWith('golang'); //false
搜索
// 查找数组中是否有某个值,存在则返回其 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-');
var_dump($data);
- 首先构建了一个字符串对象
- 使用split按照,分割为数组
- 遍历并应用$fn函数将元素转换为整数
- 排序
- 去重
- 将数组元素使用-组合成为字符串
- 判断字符串对象中是否包含-44-
类型推断
对 swoole_array对象元素操作时,底层会自动判断它的类型,如果为数组或字符串,底层会递归封装。
$array = swoole_array_list(['hello' => 'swoole']);
$array->get(0)->get('hello')->contains('swoole');
性能测试
底层实现其实就是基于str_和array_相关函数进行面向对象封装,没有过多性能损耗,仅为一次method调用开销。我们编写了严格的单测覆盖到每个API,保证其可靠性。
性能方面,使用String::contains()执行100万次,与直接运行 php strpos差距不大。
swoole_string: 0.059892892837524s, php_string: 0.033510208129883s
然而在这里可能有PHPer说用Go不香吗?要想成为一个优秀的开发者,你应该关注解决问题层面上来,用现有的技术资源去成就商业,而不是用公司的资源去成就一门技术,为了技术而技术!如果你不能用一种语言里面的基本特性写出好的代码解决问题,那你换成另外一种语言也无济于事。技术人员的发展一直都是“T”字型,如果连吃饭的PHP都学不好,转Java、GO语言你就能成为大牛了?
而PHP学到极致就不仅限于PHP的使用,势必涉及到性能优化,算法、Swoole、微服务、分布式高并发、Linux、Kafka、MQ等不一而足;先精一门,为全面且不肤浅打基础。
相关推荐
-
PHP8种变量类型的详细讲解2025-02-22 00:32:24
-
php+apache 和 php+nginx的区别2025-02-22 00:21:27
-
PHP:与workerman结合实现定时任务2025-02-22 00:15:57
-
Nginx的Rewrite规则与实例2025-02-22 00:15:39
-
MySql中身份证字段的简单脱敏介绍2025-02-22 00:15:36