在PHP项目里,数组是最常用的数据结构之一,但如果随意使用,很容易变成难以维护的乱麻。将设计模式与数组结合,可以让数组的职责更清晰,逻辑更可控。

为什么要用设计模式约束数组
原生PHP数组灵活却弱类型,函数间传递时经常不知道里面到底有什么键。引入设计模式后,我们可以用对象包装数组,或者通过统一接口来生成和遍历数组。
- 降低调用方对数组结构的依赖
- 集中处理数组的校验和默认值
- 方便替换数据来源而不影响业务
工厂模式生成标准化数组
当多个地方需要构造相似结构的数组时,可以用工厂方法统一输出,避免散落各处的硬编码。
<?php
class UserArrayFactory
{
public static function create($id, $name)
{
// 返回固定结构的用户数组
return [
'id' => (int)$id,
'name' => (string)$name,
'role' => 'guest'
];
}
}
$user = UserArrayFactory::create(1, '张三');
echo $user['name'];
?>
策略模式处理数组计算
不同业务对数组的聚合方式不同,使用策略模式可以把算法从数组中解耦。
<?php
interface ArraySumStrategy
{
public function calc(array $data);
}
class AvgStrategy implements ArraySumStrategy
{
public function calc(array $data)
{
return count($data) ? array_sum($data) / count($data) : 0;
}
}
class SumStrategy implements ArraySumStrategy
{
public function calc(array $data)
{
return array_sum($data);
}
}
$nums = [1, 2, 3];
$avg = new AvgStrategy();
echo $avg->calc($nums);
?>
迭代器模式遍历复杂数组
对于多维数组,实现Iterator可以让外部用统一方式遍历,而不必关心内部层级。
<?php
class MapIterator implements Iterator
{
private $items;
private $keys;
private $pos = 0;
public function __construct(array $items)
{
$this->items = $items;
$this->keys = array_keys($items);
}
public function current()
{
return $this->items[$this->keys[$this->pos]];
}
public function key()
{
return $this->keys[$this->pos];
}
public function next()
{
$this->pos++;
}
public function rewind()
{
$this->pos = 0;
}
public function valid()
{
return isset($this->keys[$this->pos]);
}
}
$map = new MapIterator(['a' => 1, 'b' => 2]);
foreach ($map as $k => $v) {
echo $k . ':' . $v;
}
?>
在项目中的落地建议
不必所有数组都套模式。推荐在以下场景使用:
| 场景 | 推荐模式 |
|---|---|
| 配置初始化 | 工厂模式 |
| 统计规则多变 | 策略模式 |
| 树形或分页数据 | 迭代器模式 |
合理运用这些方式,PHP数组将从松散变量变为可维护的组件。