封装一个 GeneratePassword 类,支持自定义密码长度(4-50)、批量数量(1-100)、字符规则(字母大小写、数字、特殊字符的可选/必选/强制大小写)、自定义特殊字符集。适用于批量创建账号、生成临时凭证、API Key 等场景。
1, 'number' => 1, 'special' => 1]; // 1可选 2必选 3必选小写 4必选大写 5大小写必选
private $_length = 8;
private $_num = 1;
private $_special = '!@#$%^&*()_+=-';
public function __construct($length = 8, $num = 1, $rule = [], $special = '') {
if (isset($length) && is_numeric($length) && $length >= 4 && $length <= 50) $this->_length = $length;
if (isset($num) && is_numeric($num) && $num > 0 && $num <= 100) $this->_num = $num;
if (isset($special) && is_string($special) && $special !== '') $this->_special = $special;
if ($rule) {
$t = [];
if (isset($rule['letter']) && in_array($rule['letter'], [1,2,3,4,5])) $t['letter'] = $rule['letter'];
if (isset($rule['number']) && in_array($rule['number'], [1,2])) $t['number'] = $rule['number'];
if (isset($rule['special']) && in_array($rule['special'], [1,2])) $t['special'] = $rule['special'];
if ($t) $this->_rule = $t;
}
}
public function batchGenerate() {
$passwords = [];
for ($i = 0; $i < $this->_num; $i++) {
$passwords[] = $this->generate();
}
return $passwords;
}
private function generate() {
$pool = '';
$force_pool = '';
// 字母池
if (isset($this->_rule['letter'])) {
$letter = $this->getLetter();
switch ($this->_rule['letter']) {
case 2: $force_pool .= $letter[mt_rand(0, strlen($letter)-1)]; break;
case 3: $force_pool .= strtolower($letter[mt_rand(0, strlen($letter)-1)]); $letter = strtolower($letter); break;
case 4: $force_pool .= strtoupper($letter[mt_rand(0, strlen($letter)-1)]); $letter = strtoupper($letter); break;
case 5: $force_pool .= strtolower($letter[mt_rand(0, strlen($letter)-1)]);
$force_pool .= strtoupper($letter[mt_rand(0, strlen($letter)-1)]); break;
}
$pool .= $letter;
}
// 数字池
if (isset($this->_rule['number'])) {
$number = $this->getNumber();
if ($this->_rule['number'] === 2) $force_pool .= $number[mt_rand(0, strlen($number)-1)];
$pool .= $number;
}
// 特殊字符池
if (isset($this->_rule['special'])) {
$special = $this->getSpecial();
if ($this->_rule['special'] === 2) $force_pool .= $special[mt_rand(0, strlen($special)-1)];
$pool .= $special;
}
$pool = str_shuffle($pool);
$password = str_shuffle($force_pool . substr($pool, 0, $this->_length - strlen($force_pool)));
return $password;
}
private function getLetter() { return 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'; }
private function getNumber() { return '1234567890'; }
private function getSpecial() { return $this->_special; }
}
?>
5, // 必须含大小写
'number' => 2, // 必须含数字
'special' => 2 // 必须含特殊字符
];
$special = '!@#$%_-';
$obj = new GeneratePassword(8, 10, $rule, $special);
$passwords = $obj->batchGenerate();
echo implode('
', $passwords);
/* 示例输出:
K9!mPq2@
Xy7#Lm4$
...
*/
?>
| 字符类型 | 规则值 | 含义 |
|---|---|---|
| letter | 1 | 可选(默认) |
| 2 | 必选(至少1个任意大小写) | |
| 3 | 必选小写 | |
| 4 | 必选大写 | |
| 5 | 大小写各至少1个 | |
| number | 1 | 可选 |
| 2 | 必选 | |
| special | 1 | 可选 |
| 2 | 必选 |
password_hash() 哈希存储,切勿明文保存。random_bytes() + bin2hex() 或 base64_encode() 生成高熵随机串,而非字符池拼接。' " \ ` $),避免注入风险。该类代码结构清晰、规则灵活,可直接集成到用户管理、自动化部署、测试数据生成等模块。