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

PHP 本身没有内置的“非空约束”语法(比如像数据库 NOT NULL 那样自动拦截),所谓“设置非空约束”实际是指在业务逻辑层对变量、参数或表单字段做显式校验,防止空值进入关键流程。
PHP 中判断变量是否非空:用 !empty() 还是 isset() && !== ''?
这是最常混淆的点。empty($var) 会把 0、"0"、false、null、[]、"" 都判为“空”,而很多业务中 "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 字符串,不是“非空字符串”。
最容易被忽略的一点:过滤前后空白。用户粘贴进来的 " "(全角空格)或 "\t\n " 用 empty() 判定为 true,但其实不是业务意义上的“空”。所有非空校验前,先 trim() 是硬性习惯。











