本文目录导读:

我来详细介绍 PHP 自定义规则的几种常见方式:
自定义验证规则
使用正则表达式验证
<?php
class CustomValidator {
public static function validatePhone($phone) {
// 自定义手机号规则
$pattern = '/^1[3-9]\d{9}$/';
return preg_match($pattern, $phone) === 1;
}
public static function validatePassword($password) {
// 密码规则:至少8位,包含大小写字母和数字
$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/';
return preg_match($pattern, $password) === 1;
}
}
// 使用示例
$phone = '13800138000';
if (CustomValidator::validatePhone($phone)) {
echo "手机号格式正确";
}
自定义配置规则
配置规则数组
<?php
class RuleEngine {
private $rules = [];
// 添加规则
public function addRule($name, $callback) {
$this->rules[$name] = $callback;
}
// 执行规则
public function executeRule($name, $data) {
if (isset($this->rules[$name])) {
return call_user_func($this->rules[$name], $data);
}
throw new Exception("规则 '{$name}' 不存在");
}
// 批量执行规则
public function executeRules($data, $ruleNames) {
$results = [];
foreach ($ruleNames as $name) {
$results[$name] = $this->executeRule($name, $data);
}
return $results;
}
}
// 使用示例
$engine = new RuleEngine();
// 添加自定义规则
$engine->addRule('min_length', function($data) {
return strlen($data) >= 6;
});
$engine->addRule('has_number', function($data) {
return preg_match('/\d/', $data) === 1;
});
$engine->addRule('is_email', function($data) {
return filter_var($data, FILTER_VALIDATE_EMAIL) !== false;
});
// 执行规则
$result = $engine->executeRules('test123', ['min_length', 'has_number']);
print_r($result);
自定义业务规则引擎
更复杂的规则系统
<?php
class BusinessRuleEngine {
private $rules = [];
private $conditions = [];
// 添加条件
public function addCondition($name, $callback) {
$this->conditions[$name] = $callback;
}
// 添加规则(包含条件和动作)
public function addRule($name, $condition, $action) {
$this->rules[$name] = [
'condition' => $condition,
'action' => $action
];
}
// 执行规则
public function evaluate($context) {
$results = [];
foreach ($this->rules as $name => $rule) {
$conditionResult = call_user_func($rule['condition'], $context);
if ($conditionResult) {
$actionResult = call_user_func($rule['action'], $context);
$results[$name] = [
'triggered' => true,
'result' => $actionResult
];
} else {
$results[$name] = [
'triggered' => false,
'result' => null
];
}
}
return $results;
}
}
// 使用示例
$engine = new BusinessRuleEngine();
// 添加条件
$engine->addCondition('is_vip', function($user) {
return $user['level'] >= 5;
});
$engine->addCondition('order_amount', function($order) {
return $order['amount'] > 1000;
});
// 添加业务规则
$engine->addRule(
'vip_discount',
function($context) {
return $context['user']['level'] >= 5;
},
function($context) {
return $context['order']['amount'] * 0.8; // 8折
}
);
$engine->addRule(
'free_shipping',
function($context) {
return $context['order']['amount'] > 500;
},
function($context) {
return ['free_shipping' => true, 'discount' => 30]; // 免运费
}
);
// 执行规则
$context = [
'user' => ['level' => 6],
'order' => ['amount' => 1500]
];
$results = $engine->evaluate($context);
print_r($results);
使用 YAML/JSON 配置文件定义规则
rules.yaml
validation_rules:
username:
required: true
min_length: 3
max_length: 20
pattern: '/^[a-zA-Z0-9_]+$/'
email:
required: true
pattern: '/^[\w\.-]+@[\w\.-]+\.\w+$/'
age:
required: false
min: 18
max: 120
解析配置的 PHP 代码
<?php
class RuleLoader {
public static function loadFromYaml($filePath) {
// 需要安装 yaml 扩展
$yaml = yaml_parse_file($filePath);
return $yaml;
}
public static function loadFromJson($jsonString) {
return json_decode($jsonString, true);
}
}
// 验证函数
function validateByRules($data, $rules) {
$errors = [];
foreach ($rules as $field => $rules) {
$value = $data[$field] ?? null;
if (isset($rules['required']) && $rules['required'] && empty($value)) {
$errors[$field][] = "{$field} 是必填项";
}
if (isset($rules['min_length']) && strlen($value) < $rules['min_length']) {
$errors[$field][] = "{$field} 最少需要 {$rules['min_length']} 个字符";
}
if (isset($rules['pattern']) && !preg_match($rules['pattern'], $value)) {
$errors[$field][] = "{$field} 格式不正确";
}
}
return $errors;
}
使用设计模式实现规则
策略模式示例
<?php
interface RuleInterface {
public function validate($data): bool;
public function getMessage(): string;
}
class MinLengthRule implements RuleInterface {
private $minLength;
private $message;
public function __construct($minLength, $message = null) {
$this->minLength = $minLength;
$this->message = $message ?? "长度不能小于 {$minLength}";
}
public function validate($data): bool {
return strlen($data) >= $this->minLength;
}
public function getMessage(): string {
return $this->message;
}
}
class PatternRule implements RuleInterface {
private $pattern;
private $message;
public function __construct($pattern, $message = null) {
$this->pattern = $pattern;
$this->message = $message ?? "格式不正确";
}
public function validate($data): bool {
return preg_match($this->pattern, $data) === 1;
}
public function getMessage(): string {
return $this->message;
}
}
// 使用示例
$rules = [
new MinLengthRule(6, "密码长度至少6位"),
new PatternRule('/[A-Z]/', "必须包含大写字母"),
new PatternRule('/[0-9]/', "必须包含数字")
];
$password = "Test123";
foreach ($rules as $rule) {
if (!$rule->validate($password)) {
echo $rule->getMessage() . "\n";
}
}
这些是 PHP 自定义规则的常见实现方式,你可以根据实际需求选择合适的方法,规则引擎可以用于表单验证、权限控制、业务逻辑判断等多种场景。