PHP怎样设置非空约束_PHP设置非空规则【注意】

11次阅读

PHP无内置非空约束,需业务层校验;推荐按场景选!empty()、isset()&&!==”或is_string()&&strlen()>0;laravel用”required”但默认拒0,需自定义规则;类型声明不防空,须结合trim()和显式检查。

PHP怎样设置非空约束_PHP设置非空规则【注意】

php 本身没有内置的“非空约束”语法(比如像数据库 NOT NULL 那样自动拦截),所谓“设置非空约束”实际是指在业务逻辑层对变量、参数或表单字段做显式校验,防止空值进入关键流程。

PHP 中判断变量是否非空:用 !empty() 还是 isset() && !== ''

这是最常混淆的点。empty($var) 会把 0"0"falsenull[]"" 都判为“空”,而很多业务中 "0" 或整数 0 是合法值。比如商品库存为 0,不能被当成“未填写”。

推荐按场景选择:

  • 只要求“存在且不为假值(含 "0")” → 用 !empty($var)
  • 只要求“已定义且不等于空字符串” → 用 isset($var) && $var !== ''
  • 要求“必须是字符串且长度 > 0” → 用 is_string($var) && strlen(trim($var)) > 0

例如处理 POST 表单中的用户名:

立即学习PHP免费学习笔记(深入)”;

if (!isset($_POST['username']) || trim($_POST['username']) === '') {     throw new InvalidArgumentException('用户名不能为空'); }

Laravel 验证器里怎么写非空规则?

Laravel 的 Validator 使用字符串规则,"required" 就是标准的非空校验,但它默认也拒绝 "0"0 —— 这和 empty() 行为一致。如果要允许 0,得组合规则:

  • "required|String":必须存在、非空、且是字符串
  • "required_without:price|Nullable":当 price 不存在时才要求本字段,允许 null
  • 真正想接受 0 又拒绝 ""?得自定义规则或用 required_if + 闭包

常见错误:写成 "required|min:1" 去防空,但 min:1 对字符串是长度校验,对数字才是值校验,类型不一致会出 bug

PHP 8.0+ 属性类型声明能替代非空校验吗?

不能。即使写了 public string $name;,PHP 也不会阻止你赋值 null(除非开启严格模式并配合构造函数约束)。属性类型声明只限制类型,不限制“是否为空”。

真正起作用的是构造函数参数类型 + 显式检查:

public function __construct(private string $name) {     if ($name === '') {         throw new ValueError('Name cannot be empty string');     } }

注意:string 类型声明允许 "",它只是非 null 字符串,不是“非空字符串”。

最容易被忽略的一点:过滤前后空白。用户粘贴进来的 "  "(全角空格)或 "tn "empty() 判定为 true,但其实不是业务意义上的“空”。所有非空校验前,先 trim() 是硬性习惯。

text=ZqhQzanResources