PHP 面向对象 全局数组,PHP 完全面向对象风格的 Array 和 String 编程

本文介绍了Swoole库中如何通过swoole_array和swoole_string类,以面向对象方式改进PHP的字符串和数组操作,提供链式API,强类型支持和性能优化。作者还展示了如何使用这些类进行数组处理、字符串操作和性能测试实例。
摘要由CSDN通过智能技术生成

在 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 工具时,可以实现完全自动提示和自动完成。

77b6db8ff227895dd47cabd4309ff8cb.png

创建数组

$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

源代码

如果您对此项目感兴趣,可以参与到我们的开发工作中,期待您的 Pull Request。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值