你喜欢用JavaScript编写代码吗,但是对于某些项目必须使用PHP吗?请继续阅读以了解如何使用有趣的图书馆将两者结合起来。
自2000年以来我一直在使用PHP,并且使用JavaScript的时间更长。在过去的十年里,JavaScript已经发生了巨大的变化。它从一开始就有一个很有前途的设计,并且随着转向ES2015(Harmony)而获得了目前令人难以置信的形状。PHP虽然没有改变那么多。显然,它注定会永远遭受自己的遗产。它到达90年代中期,作为一个简单的CGI应用程序来维护Rasmus Lerdorf的主页,并且更像是自发地发展起来的。这导致语法不一致,功能和基于OOP的资产混合在一起,缺乏体面的语言规范。所以每次我切换到PHP时,我都会错过JavaScript的合理性,可预测性和灵活性。这让我想到了一个可以为PHP带来类似JavaScript的开发体验的库。最终,使用JavaScript(Underscore除外)方法扩展PHP类型的Extras,解锁链接,并引入PlainObject代表对象文字的 类型。
该库使用JavaScript和Underscore.js方法丰富了以下PHP类型:数组(包括顺序和关联),字符串,数字(整数,浮点数,NaN),函数(可调用),集合(Iterable,ArrayObject,Iterator)和布尔值。每个添加的方法都是表示类型的类的静态方法。因此,我们可以直接访问任何内容,而不需要创建链 Arrays::map。
这有什么好处?我们来看看下面的代码片段:
<?php
use \Dsheiko\Extras\Arrays;
function numToArray(int $value, int $index, array $array): array
{
return [$value];
}
$res = Arrays::map(range(1,3), "numToArray"); // [[1],[2],[3]]
不同的是\array_map, 库方法的接口与任何其他数组extras一致。第一个参数始终是源数组,接下来会迭代/预测回调,如果需要则返回其他任何内容。更?使用PHP数组函数,我们需要记住哪一个只接受源或引用的引用。 Arrays::*方法总是接受独立的值和引用。
你有没有注意到回调参数列表?是的,它根据ECMAScript规范进行了扩展。除了值之外,它总是接收元素索引(关联数组中的键)和初始数组。
另外,所有添加的方法都可以连接在一起:
<?php
use \Dsheiko\Extras\Arrays;
$res = Arrays::chain([1, 2, 3])
->map(function($num){ return $num + 1; })
->filter(function($num){ return $num > 1; })
->reduce(function($carry, $num){ return $carry + $num; }, 0)
->value();
对我来说,它看起来比以下更干净:
$array = [1, 2, 3];
$array = \array_map(function($num){ return $num + 1; }, $array);
$array = \array_filter($array, function($num){ return $num > 1; });
$array = \array_reduce($array, function($carry, $num){ return $carry + $num; }, 0);
什么其他类型呢?如果我们接受一个字符串,它的工作原理是一样的:
<?php
use \Dsheiko\Extras\Strings;
function sanitizeSearchTerm(string $value, int $maxLength): string
{
return Strings::chain($value)
->trim()
->replace('`[^0-9\-_ \p{L}]`u', ' ')
->replace('` +`', ' ')
->substr(0, $maxLength)
->value();
}
此外,我们还可以在同一链中操作多种类型:
<?php
use \Dsheiko\Extras\Arrays;
$res = Arrays::chain(["foo" => "FOO", "bar" => "BAR"])
// input: array, output: string
->reduce(function($carry, $val, $key){ return $carry . " {$key}:{$val} "; }, "")
// input: string, output: integer
->indexOf("bar:")
// input: integer, output: double
->toFixed(2)
->value();
实际上,你甚至不需要猜测入口点的类型。相反,你可以使用类型:
<?php
use \Dsheiko\Extras\Any;
$res = Any::chain(new \ArrayObject([1,2,3]))
->toArray() // value is [1,2,3]
->map(function($num){ return [ "num" => $num ]; })
// value is [[ "num" => 1, ..]]
->reduce(function($carry, $arr){
$carry .= $arr["num"];
return $carry;
}, "") // value is "123"
->replace("/2/", "") // value is "13"
->then(function($value){
if (empty($value)) {
throw new \Exception("Empty value");
}
return $value;
})
->value();
正如你在这个例子中看到的,我也使用then类似于Promise API 的链式方法 。它接受链条的实际价值,并根据链条是否被修改进一步传递。
没有说服?那么,我们对类型做了很多操作,尤其是对于数组。数组函数有助于隔离迭代范围并提高性能,但在展示开发人员意图时,它们并不那么方便。实际上,我们经常解决类似的逻辑任务,我们可以简单地重用现有的模式。Extras库包含一组Underscore.js方法。它有所作为。试想一下,您有一系列键值对象(实际上是关联数组),其中携带有关剧院中所有剧本的数据。根据用户应用的过滤器,您需要搜索匹配的播放。每次使用回调时\array_filter, 您都可以使用 Arrays:where:
$listOfPlays = [
["title" => "Cymbeline", "author" => "Shakespeare", "year" => 1611],
["title" => "The Tempest", "author" => "Shakespeare", "year" => 1611],
["title" => "Hamlet", "author" => "Shakespeare", "year" => 1603]
];
$res = Arrays::where($listOfPlays, ["author" => "Shakespeare", "year" => 1611]);
// [
// ["title" => "Cymbeline", "author" => "Shakespeare", "year" => 1611],
// ["title" => "The Tempest", "author" => "Shakespeare", "year" => 1611],
// ]
或者,假设您有一个描述产品的键值数据结构。您需要提取包含您选择的唯一对的较小对象(此处为关联数组):
$res = Arrays::pick([
'name' => 'moe',
'age' => 50,
'userid' => 'moe1',
//… 100 more lines
], 'name', 'age');
// ['name' => 'moe', 'age' => 50, ]
正如您可能注意到的,Extras可以反映PHP数组中的JavaScript类型数组和对象(分别为顺序和关联)。此外,可以从中获得类似于JavaScript普通对象的类型:
use \Dsheiko\Extras\Arrays;
$po = Arrays::object(["foo" => "FOO", "bar" => ["baz" => "BAZ"]]);
echo $po->foo; // FOO
echo $po->bar->baz; // BAZ
该类型继承了Underscore Object方法:
use \Dsheiko\Extras\Arrays;
$po = Arrays::object([
"start" => 5,
"end" => 12,
]);
$res = $po->mapObject(function($val){
return $val + 5;
}) // PlainObject{ "start": 10, "end": 17 }
->invert(); // PlainObject{ 10: "start", 17: "end" }
Extras是一个可通过作曲者使用的PHP包:
composer require "dsheiko/extras"
它旨在改进PHP的开发体验。也就是说,它提供了一种具有一致的命名约定和一致的参数顺序的类型操纵工具带。任何交付的方法都是可链接的。除了PHP泛型类型之外,该软件包还带有PlainObject,它类似于JavaScript普通对象。包方法遵循相应的JavaScript和Underscore.js / Lodash方法的语法和逻辑。
评论留言