PHP 数组可能会让来自其他编程语言的开发者感到惊讶。
这个非常方便的结构可以存储各种类型的元素,但它并不完美。
简单介绍 PHP 数组
在核心层面上,数组是一个映射。它通常包含键和值,值可以是数组,让你能够构建树形和其他多维结构(如果有意义的话):
代码语言:php复制$array = [
"foo" => "bar",
"bar" => "foo",
];
$array2 = [
"foofoo" => "barbar",
"barbar" => $array,
];
键是可选的,如果你不指定键,PHP 会自动递增数字。
如果你阅读文档,学习和使用都相当容易。
PHP 数组的缺陷
PHP 中到处都是数组。我是说,真的随处可见。
它非常方便,因为你有大量内置的辅助工具和函数,可以进行各种排序、过滤和其他常见操作。
在我看来,这可能是使用这种结构的一个有效理由,特别是当你想要处理元素列表时。
然而,这并不是魔法。最大的问题是你几乎可以将任何东西放入数组中,有时这样做会使安全使用和测试变得更加困难。
在嵌套数组中,为了类型安全经常会写下好几行防御性代码,更不用说在典型的 PHP 脚本中会发现多个 isset() 或 empty() 了。
这本身并不是坏事,但有些开发者可能更喜欢具有定义结构的面向对象方法。
如果开始将关联数组传递给函数,会变得更糟糕,需要一遍又一遍地重复相同的测试。
代码语言:php复制function myfunc(array $params) {
if (!isset($params['id'], $params['name']) {
return 'Atchoum';
}
}
// 对比
代码语言:php复制function myfunc(ParamObject $params) {}
如上例所示,在上述示例中,你只能使用内置的数组进行类型提示。
还有其他方法
PHP 还有其他你可能还不知道的结构:
生成器(generators):它们提供了几乎相同的功能(你可以在 foreach 循环中使用它们),但内存消耗更少,特别是如果不需要进行复杂操作(例如,不允许回滚操作)。
集合(collections):你会得到更强的类型,因为你的自定义集合只会处理特定的子类型,而不是更多(例如,Laravel 集合)。
总结
PHP 数组非常方便,但请注意,并不存在能够适用于所有情况的魔法解决方案。
我们看到了一些可以改进代码的替代方法,包括类型安全和可读性,同时保持了方便的语法。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!