本文目录导读:

我来详细介绍 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 自定义规则的常见实现方式,你可以根据实际需求选择合适的方法,规则引擎可以用于表单验证、权限控制、业务逻辑判断等多种场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播