news 2026/6/23 17:05:09

PHP数据填充与工厂数据生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP数据填充与工厂数据生成

PHP数据填充与工厂数据生成

测试数据生成是开发和测试中的常见需求。数据工厂可以快速生成测试数据。今天说说PHP中数据填充和工厂模式的应用。

Faker生成假数据。

```php
// composer require fakerphp/faker

require 'vendor/autoload.php';

$faker = Faker\Factory::create('zh_CN');

echo "姓名: {$faker->name}\n";
echo "地址: {$faker->address}\n";
echo "邮箱: {$faker->email}\n";
echo "电话: {$faker->phoneNumber}\n";
echo "公司: {$faker->company}\n";
?>

自定义数据工厂。

```php
class ModelFactory
{
private static array $definitions = [];
private static array $states = [];

public static function define(string $class, callable $factory): void
{
self::$definitions[$class] = $factory;
}

public static function state(string $class, string $state, callable $modifier): void
{
self::$states[$class][$state] = $modifier;
}

public static function create(string $class, array $overrides = [], ?string $state = null): object
{
$data = (self::$definitions[$class])();
return new $class(array_merge($data, $overrides));
}

public static function createMany(string $class, int $count, array $overrides = []): array
{
$results = [];
for ($i = 0; $i < $count; $i++) {
$results[] = self::create($class, $overrides);
}
return $results;
}

public static function insertMany(PDO $pdo, string $table, int $count, array $overrides = []): array
{
$ids = [];
$columns = [];
$inserted = false;

for ($i = 0; $i < $count; $i++) {
$data = array_merge((self::$definitions[$table])(), $overrides);

if (!$inserted) {
$columns = array_keys($data);
$inserted = true;
}

$stmt = $pdo->prepare("INSERT INTO $table (" . implode(',', $columns) . ") VALUES (" . implode(',', array_fill(0, count($data), '?')) . ")");
$stmt->execute(array_values($data));
$ids[] = (int)$pdo->lastInsertId();
}

return $ids;
}
}

class User
{
public function __construct(public array $data) {}
public function __get(string $name): mixed { return $this->data[$name] ?? null; }
}

ModelFactory::define(User::class, function () {
return [
'name' => '用户_' . uniqid(),
'email' => 'user_' . uniqid() . '@example.com',
'age' => rand(18, 60),
'status' => ['active', 'inactive', 'banned'][rand(0, 2)],
'created_at' => date('Y-m-d H:i:s', time() - rand(0, 86400 * 30)),
];
});

ModelFactory::state(User::class, 'admin', function ($data) {
return array_merge($data, ['role' => 'admin']);
});

ModelFactory::state(User::class, 'vip', function ($data) {
return array_merge($data, ['status' => 'active', 'vip_level' => 3]);
});

$user = ModelFactory::create(User::class);
echo "姓名: {$user->name}, 邮箱: {$user->email}\n";

$users = ModelFactory::createMany(User::class, 3);
echo "创建用户: " . count($users) . "\n";
?>

测试数据生成器。

```php
class DataGenerator
{
private static array $firstNames = ['张', '李', '王', '赵', '刘', '陈', '杨', '黄'];
private static array $lastNames = ['三', '四', '五', '明', '华', '强', '伟', '芳'];
private static array $cities = ['北京', '上海', '广州', '深圳', '杭州'];

public static function name(): string
{
return self::$firstNames[array_rand(self::$firstNames)]
. self::$lastNames[array_rand(self::$lastNames)];
}

public static function phone(): string
{
return '1' . rand(3, 9) . rand(100000000, 999999999);
}

public static function email(): string
{
$domains = ['qq.com', '163.com', 'gmail.com', 'outlook.com'];
return 'user' . uniqid() . '@' . $domains[array_rand($domains)];
}

public static function address(): string
{
$city = self::$cities[array_rand(self::$cities)];
$district = ['朝阳区', '海淀区', '浦东新区', '天河区'][rand(0, 3)];
$street = rand(1, 100) . '号';
return "{$city}{$district}{$street}";
}

public static function dateBetween(string $start, string $end): string
{
$start = strtotime($start);
$end = strtotime($end);
return date('Y-m-d', rand($start, $end));
}

public static function paragraph(int $sentences = 3): string
{
$texts = ['PHP是一种流行的编程语言', '它是Web开发的常用工具', '框架如Laravel很受欢迎', '性能优化是重要话题'];
$result = [];
for ($i = 0; $i < $sentences; $i++) {
$result[] = $texts[array_rand($texts)];
}
return implode('。', $result) . '。';
}

public static function user(array $overrides = []): array
{
return array_merge([
'name' => self::name(),
'phone' => self::phone(),
'email' => self::email(),
'address' => self::address(),
'created_at' => self::dateBetween('2023-01-01', '2024-12-31'),
], $overrides);
}
}

print_r(DataGenerator::user(['status' => 'active']));
?>

数据工厂和填充工具在开发和测试中很有用。Faker生成各种语言的假数据,数据工厂批量创建测试数据,自定义生成器针对特定场景。合理的测试数据生成可以提高开发和测试效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 16:56:01

Kinetis K32L2A FlexIO模块驱动8080总线TFT LCD实战指南

1. 项目概述与核心价值在嵌入式开发中&#xff0c;图形化人机界面&#xff08;HMI&#xff09;的需求日益增长&#xff0c;而TFT LCD是其中最常见的显示方案。许多低成本、低功耗的微控制器&#xff08;MCU&#xff09;为了保持设计的精简&#xff0c;并未集成专用的LCD控制器&…

作者头像 李华
网站建设 2026/6/9 20:38:10

基于NXP i.MX RT与LVGL的嵌入式语音识别GUI应用开发实战

1. 项目概述在嵌入式设备上实现自然流畅的人机交互&#xff0c;一直是开发者追求的目标。传统的交互方式&#xff0c;比如按键和触摸屏&#xff0c;虽然成熟可靠&#xff0c;但在某些特定场景下——比如双手被占用、设备安装位置不便触摸&#xff0c;或者仅仅是追求更“酷”的科…

作者头像 李华
网站建设 2026/6/23 17:04:27

基于MC68HC08KH12的USB键盘集线器:嵌入式系统设计与USB协议实践

1. 项目概述与核心价值如果你在2000年前后折腾过电脑&#xff0c;肯定对机箱后面那堆五花八门的接口和缠绕成团的线缆记忆犹新。每次想插个新键盘或者鼠标&#xff0c;都得关机、摸索着找到对应的PS/2或串口、再开机&#xff0c;过程繁琐不说&#xff0c;还经常插错。通用串行总…

作者头像 李华
网站建设 2026/6/8 18:49:15

3分钟搞定GitHub Desktop中文界面:免费开源汉化工具终极指南

3分钟搞定GitHub Desktop中文界面&#xff1a;免费开源汉化工具终极指南 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 【GitHub桌面客户端中文汉化】 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 你是否曾经因为…

作者头像 李华