PHP数据填充与工厂数据生成
PHP数据填充与工厂数据生成测试数据生成是开发和测试中的常见需求。数据工厂可以快速生成测试数据。今天说说PHP中数据填充和工厂模式的应用。Faker生成假数据。php// composer require fakerphp/fakerrequire 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;?自定义数据工厂。phpclass 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;?测试数据生成器。phpclass 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生成各种语言的假数据数据工厂批量创建测试数据自定义生成器针对特定场景。合理的测试数据生成可以提高开发和测试效率。