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生成各种语言的假数据,数据工厂批量创建测试数据,自定义生成器针对特定场景。合理的测试数据生成可以提高开发和测试效率。
PHP数据填充与工厂数据生成
张小明
前端开发工程师
Kinetis K32L2A FlexIO模块驱动8080总线TFT LCD实战指南
1. 项目概述与核心价值在嵌入式开发中,图形化人机界面(HMI)的需求日益增长,而TFT LCD是其中最常见的显示方案。许多低成本、低功耗的微控制器(MCU)为了保持设计的精简,并未集成专用的LCD控制器&…
SpringBoot自动配置实战:用@ConditionalOnMissingBean优雅管理你的Bean(附Drools配置案例)
SpringBoot自动配置实战:用ConditionalOnMissingBean优雅管理你的Bean(附Drools配置案例)在SpringBoot生态中,自动配置机制一直是其"约定优于配置"理念的核心体现。但当我们从框架使用者转变为框架设计者时,…
基于NXP i.MX RT与LVGL的嵌入式语音识别GUI应用开发实战
1. 项目概述在嵌入式设备上实现自然流畅的人机交互,一直是开发者追求的目标。传统的交互方式,比如按键和触摸屏,虽然成熟可靠,但在某些特定场景下——比如双手被占用、设备安装位置不便触摸,或者仅仅是追求更“酷”的科…
基于MC68HC08KH12的USB键盘集线器:嵌入式系统设计与USB协议实践
1. 项目概述与核心价值如果你在2000年前后折腾过电脑,肯定对机箱后面那堆五花八门的接口和缠绕成团的线缆记忆犹新。每次想插个新键盘或者鼠标,都得关机、摸索着找到对应的PS/2或串口、再开机,过程繁琐不说,还经常插错。通用串行总…
基于51单片机的红外+超声波双模感应智能垃圾桶(含Proteus仿真与AD原理图)
本文还有配套的精品资源,点击获取 简介:这个资源包提供一套可直接运行的51单片机智能垃圾桶完整方案,支持红外人体感应自动开盖、超声波或ADC0832芯片检测垃圾高度、LED满溢状态提示,以及按键手动切换可回收/不可回收投放模式。…
3分钟搞定GitHub Desktop中文界面:免费开源汉化工具终极指南
3分钟搞定GitHub Desktop中文界面:免费开源汉化工具终极指南 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 【GitHub桌面客户端中文汉化】 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 你是否曾经因为…