我是 Laravel 开发员,不是 PHP 开发员
国外DISS PHP 的人很多很多,但是说Laravel坏话的没有。我发现很多Laravel 开发者不会想去 php.net 找答案,因为里面你所能看到的大部分函数, Laravel 有一个(或者多个)对应包裹 (Wrapper) 或者 函数。 做Laravel多了,甚至有种没有在写PHP的感觉。 我尽量不用PHP函数,理由如下:
- 保持代码标准。比如说函数应该是小驼峰,但是 PHP的函数都是蛇行 (snake_case)。现在业界的标准是,所有函数都应该是小驼峰 (camelCase),所有类都应该是大驼峰(CamelCase) , 所有常量 都应该是全大写 。 Laravel 本身的函数都是跟这个标准的, ( arr_search, str_replace 那类是例外,我基本上也不用他们)
- 流式接口 ( Fluent Interface) 。Laravel很多时候是推荐这种代码格式的,我们很经常这么写:
$user = App\User::where('name', 'Test') ->whereNull('verification_date');
如果这些函数PHP有的话,你就要可能这么写:
$userObject = new App\User(); $user = user_where_null(user_where('name', 'Test'), 'verification_date');
你需要的函数越多,括号也越多。所以我是倾向于流式接口的,干净,高端大气上档次。但是Laravel不是万能的, 有些函数也是没有的. (下面有例子)
我昨天看到了 LHao 大大的 这个: 博客:每日五个 PHP 函数记忆 , 启发了我,把那些 PHP 函数转换为 Laravel 函数, 就先翻译五个吧:
array_combine
--- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 ,
// php 版本
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);
print_r($c); // 输出:['green' => 'avocado', 'red' => 'apple', 'yellow' => 'banana']
// Laravel 版本
$a = collect(['green', 'red', 'yellow']);
$b = ['avocado', 'apple', 'banana'];
$a->combine($b)
->dump();
//输出:
Collection {#1812 ▼
#items: array:3 [▼
"green" => "avocado"
"red" => "apple"
"yellow" => "banana"
]
}
array_count_values
--- 统计数组中所有的值, 没有 Laravel 版本
// 说明:array_count_values ( array $array ) : array
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array)); // 输出:[1 => 2, "hello" => 2, "world" => 1]
array_diff_assoc
--- 带索引检查计算数组的差集
// 说明:array_diff_assoc ( array $array1 , array $array2 [, array $... ] ) : array
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result); // 输出:["b" => "brown", "c" => "blue", 0 => "red"]
// 大家可以发现这里 red 有输出,为啥呢,因为第二个数组中 red 的 key 为 1。与数组一中的 key 为 0,不一致,所以有输出。
// Laravel
$array1 = collect([
"a" => "green",
"b" => "brown",
"c" => "blue", "red"
]);
$array2 = [
"a" => "green",
"yellow", "red"
];
return $array1->diffAssoc($array2);
// Result
{
"0": "red",
"b": "brown",
"c": "blue"
}
array_diff_key
--- 使用键名比较计算数组的差集
// 说明:array_diff_key ( array $array1 , array $array2 [, array $... ] ) : array
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
var_dump(array_diff_key($array1, $array2)); // 输出:['red' => 2, 'purple' => 4]
//laravel
$array1 = collect([
'blue' => 1,
'red' => 2,
'green' => 3,
'purple' => 4]
);
$array2 = [
'green' => 5,
'blue' => 6,
'yellow' => 7,
'cyan' => 8
];
return $array1->diffKeys($array2);
// result
{
"red": 2,
"purple": 4
}
array_diff_uassoc
--- 用用户提供的回调函数做索引检查来计算数组的差集
// 说明:array_diff_uassoc ( array $array1 , array $array2 [, array $... ], callable $key_compare_func ) : array
function key_compare_func($a, $b)
{
if ($a === $b) {
return 0;
}
return ($a > $b)? 1:-1;
}
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_uassoc($array1, $array2, "key_compare_func");
print_r($result); // 输出:["b" => "brown", "c" => "blue", 0 => "red"]
// Laravel
$array1 = collect([
"a" => "green",
"b" => "brown",
"c" => "blue",
"red"
]);
$array2 = [
"a" => "green",
"yellow",
"red"
];
return $array1->diffAssocUsing($array2, function ($a, $b) {
if ($a === $b) {
return 0;
}
return $a > $b
? 1
: -1;
});
// result
{
"0": "red",
"b": "brown",
"c": "blue"
}
如果需要多过一个函数的时候, Collect 和 流式接口 的优势就显现出来了, 栗子:
$array1 = collect([
'blue' => 1,
'red' => 2,
'green' => 3,
'purple' => 4]
);
$array2 = [
'green' => 5,
'blue' => 6,
'yellow' => 7,
'cyan' => 8
];
return $array1->diffKeys($array2)
->transform(function ($item, $key) {
return [
'key' => $key,
'difference' => $item,
];
})
->values()
->all();
//结果
[
{
"key": "red",
"difference": 2
},
{
"key": "purple",
"difference": 4
}
]
上面的例子, 首先用 Key 找到两个 Array 的差别,然后将结果变形 (变形或者 Transform 会保留原本的Key, 只变形值),剔除原本的 Key , 然后整合成全新的 Array 。 可以看得出来,很清楚,很容易修改代码, 如果你要是用原本的PHP函数,你就得去追括号了,很多括号 。。。。 额,我残念了。
当然 Laravel Collection 也不是万能的,比如说上面那个 array_count_values
我就没找到好的代替方法,所以在这种情况下,还是乖乖用 PHP 自带功能吧。
后话
我这个人很坚持软件开发标准,因为我相信如果大家都信奉一条标准,开发过程会变得更有效率,而且日后的维护和升级,都会简单不少。我的团队的开发标准制定地很详细,所以我们看到 Bug , 可以在半个小时内,找到根源并修复。 复发几乎没有的事情。 而我们以前的代码(咳咳,不靠谱的前队友)有些不按照规定来写,修起来耗时间, 加功能更是几乎不可能,修三四次,每次都有新问题, 原作者当时也离职了,他的代码也没人看得懂。 最后,很多时候,只能重写。 不过大体上一切都很easy, 我们在 Laravel 更新框架版本一个月后更新上去, 也没有出过乱子。 我个人觉得,很大部分原因是因为我们保持了标准,而且我们的标准和Laravel官方的标准非常相似。
本作品采用《CC 协议》,转载必须注明作者和本文链接
对不起各位,我有点标题党了。本文意思绝非贬低php原生
推荐文章: