admin 发表于 2022-5-14 13:18:15

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([&#39;hello&#39;, &#39;world&#39;]);$array2 = swoole_array([&#39;hello&#39; => 1, &#39;world&#39; => 2]);$array3 = swoole_array_list(&#39;hello&#39;, &#39;world&#39;, &#39;swoole&#39;, &#39;php&#39;);</pre>""创建字符串

// Bytes 字符串$string1 = swoole_string(&#39;hello world, php java, swoole&#39;);// 宽字符串$string2 = swoole_mbstring(&#39;我是中国人&#39;);// 返回 5$string2->length();</pre>""获取元素

// 获取$value1 = $array1->get(0);$value2 = $array2->get(&#39;hello&#39;);// 数组的第一个元素$first = $array->first();// 数组的最后一个元素$last = $array->last();</pre>""增加/设置

// 设置$array1->set(0, &#39;swoole&#39;);$array2->set(&#39;world&#39;, 9);// 在末尾追加$array1->pushBack(&#39;java&#39;);// 在头部插入$array1->pushFront(&#39;go&#39;);// 在中间 offset 2 插入$array1->insert(2, &#39;rust&#39;);</pre>""连续追加

$array1->append(&#39;rust&#39;)->append(&#39;c++&#39;)->append(&#39;swift&#39;, &#39;kotlin&#39;);$array2->set(&#39;rust&#39;, 99)->set(&#39;c++&#39;, 88)->set(&#39;kotlin&#39;, 77);</pre>""删除

// 按 key 删除$array1->delete(0);$array2->delete(&#39;worker&#39;);// 按 value 删除$array1->remove(&#39;hello&#39;);</pre>""包含

使用contains()方法可以判断数组或字符串中是否包含某个元素。
$array1->contains(&#39;java&#39;);$string1->contains(&#39;php&#39;);</pre>使用startsWith()和endsWith()方法判断字符串开头和结尾是否为指定的值。
$str = swoole_string(&#39;php and swoole&#39;);$str->startsWith(&#39;php&#39;); //true$str->startsWith(&#39;java&#39;); //false$str->endsWith(&#39;swoole&#39;); //true$str->endsWith(&#39;golang&#39;); //false</pre>""搜索

// 查找数组中是否有某个值,存在则返回其 key$key = $array1->search(&#39;java&#39;);</pre>""结合使用

String与Array可以结合使用。
$s = &#39;11, 33, 22, 44,12,32,55,23,19,23&#39;;$data = swoole_string($s)    ->split(&#39;,&#39;)    ->each(fn(&$item) => $item = intval($item))    /* < 7.4 : function (&$item){ $item = intval($item);} */    ->sort()    ->unique()    ->join(&#39;-&#39;)    ->contains(&#39;-44-&#39;);var_dump($data);</pre>

[*]首先构建了一个字符串对象
[*]使用split按照,分割为数组
[*]遍历并应用$fn函数将元素转换为整数
[*]排序
[*]去重
[*]将数组元素使用-组合成为字符串
[*]判断字符串对象中是否包含-44-
""类型推断

对 swoole_array对象元素操作时,底层会自动判断它的类型,如果为数组或字符串,底层会递归封装。
// Bytes 字符串$string1 = swoole_string(&#39;hello world, php java, swoole&#39;);// 宽字符串$string2 = swoole_mbstring(&#39;我是中国人&#39;);// 返回 5$string2->length();0</pre>""性能测试

底层实现其实就是基于str_和array_相关函数进行面向对象封装,没有过多性能损耗,仅为一次method调用开销。我们编写了严格的单测覆盖到每个API,保证其可靠性。
性能方面,使用String::contains()执行100万次,与直接运行 php strpos差距不大。
// Bytes 字符串$string1 = swoole_string(&#39;hello world, php java, swoole&#39;);// 宽字符串$string2 = swoole_mbstring(&#39;我是中国人&#39;);// 返回 5$string2->length();1</pre>然而在这里可能有PHPer说用Go不香吗?要想成为一个优秀的开发者,你应该关注解决问题层面上来,用现有的技术资源去成就商业,而不是用公司的资源去成就一门技术,为了技术而技术!如果你不能用一种语言里面的基本特性写出好的代码解决问题,那你换成另外一种语言也无济于事。技术人员的发展一直都是“T”字型,如果连吃饭的PHP都学不好,转Java、GO语言你就能成为大牛了?
而PHP学到极致就不仅限于PHP的使用,势必涉及到性能优化,算法、Swoole、微服务、分布式高并发、Linux、Kafka、MQ等不一而足;先精一门,为全面且不肤浅打基础。为了大家能够顺利进阶架构师,我特地准备了一套精品PHP架构师教程,助你薪资突破30K。


""领取方式:点赞关注小编后私信【资料】获取资料领取方式!

部分资料展示:








""领取方式:点赞关注小编后私信【资料】获取资料领取方式!
页: [1]
查看完整版本: PHP8完全面向对象风格的 Array 和 String 编程