PHP 三元 !empty 而不是评估为真或假 可用isset()

是否可以使用速记三元来检查变量是否已设置,而不是是否计算结果为零或非零?

例如,我试过:

$var = 0;
echo (string) $var ?: (string) false ?: 2;

但由于前两个表达式的计算结果均为“0”或“false”,因此显示为 2。

我认为也许将它们转换为字符串会产生不同的结果,但事实并非如此。我想零就是零。

我想在分配变量时使用这种样式,例如

$get->var = $get->var ?: $setindb ?: $default;

如果设置了$get->var,我想将$get->var分配给$get->var,否则,检查db是否有值,否则,使用默认值。

我想我会提到我知道我可以做类似的事情

$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )

但你来判断哪个更简单:)

【问题讨论】:

  • 为什么不使用 isset($get->var) 代替?

  • 好吧,在我上面的例子中,不是空的, isset 会更合适,但这仍然让我处于同样的情况。我一直在寻找一种更清洁、更简单的方法。

【解决方案1】:

字符串“0”和“false”在 PHP 中被视为 FALSE-y (list of false values) 值。

isset() 为已设置的变量返回 TRUE 而不是 NULL。 empty() 将检查变量是否已设置,并且该变量不是 FALSE 值。所以它会为“0”返回TRUE

我认为你想要的是你的第三个代码 sn-p,但使用isset(),而不是empty()

最简单的方法(使用最少的括号)是:

$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);

由于速记三元返回第一个参数,你不能使用它,因为那将是一个布尔值。 (isset($get->var) ?: $default 将返回 TRUEFALSE 或 $default,但绝不会返回 $get->var 的值。)


编辑:也许你想要一个像合并函数这样的东西?据我所知,PHP 本身并不提供它,但创建起来很简单。请注意,这可能有点难看,因为它使用传递对函数的引用。我会对这方面的 cmets 感兴趣(它有我想的那么糟糕吗?)。

function coalesce(array $values)
{
    foreach($values as &$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));

我还没有测试过上述内容。将数组中的变量作为引用传递(& 符号)。我很确定它会被 coalesce(array(1,"a_string",false)); 这样的东西窒息。

【讨论】:

  • 好的,不知道是否有一些技巧(比如强制转换)三元会检查除真假以外的技巧

empty()和isset()的区别及应用场景:

a.当判断一个变量是否定义时,可用isset();

应用:表单提交时用isset($_POST['submit'])的值来判定是否提交表单。

b.当判断一个变量是否为空时(不需要知道其是否赋值),可用empty();

应用:表单验证时,需验证必填项值是否为空。

c.当判断一个变量已经存在且不为空,可先用isset(),再用empty();

应用:文件上传时,需判断$_FILES已赋值,且不为空。
 

`isset()` 是 PHP 中非常常用的一个函数,主要用于检查变量是否已设置并且不是 `NULL`。它可以帮助开发者避免使用未初始化或已被销毁的变量,从而提高代码的安全性和健壮性。 ### 功能描述 - **语法**:`bool isset ( mixed $var [, mixed $... ] )` - 当指定的变量存在,并且其值不是一个未经设置的状态(即不是 `null`),则返回 `true`;否则返回 `false`。 - 可以同时检查多个变量是否存在并有值,只要所有给定的参数都满足条件,则结果为 `true`。 ### 使用场景 1. 检查表单提交的数据项是否已经被用户填写: ```php if (isset($_POST['username'])) { echo "用户名已经输入"; } else { echo "请输入用户名"; } ``` 2. 判断数组元素是否存在及是否有有效内容: ```php $arr = ['a' => 'apple', 'b' => 'banana']; if (isset($arr['c'])) { echo "键 'c' 存在"; // 此处不会被执行因为不存在键 'c' } if (!isset($arr['d'])) { echo "键 'd' 不存在"; // 将会执行这条语句 } ``` 3. 结合三元运算符简化逻辑判断: ```php $value = isset($_GET['id']) ? $_GET['id'] : '默认ID'; ``` 4. 避免对空值进行操作而引发错误: ```php function processValue($data) { if(isset($data)){ doSomethingWith($data); } } ``` ### 注意事项 - 如果传递了多个参数到 `isset()` ,那么只有当所有的参数都被设定时才会返回 true。 - 对于通过引用传入但尚未赋初值的新声明变量,`isset()` 返回 false。 - `unset()` 后再用 `isset()` 测试该变量将会得到 false 值。 以上就是关于 PHP 中 `isset()` 函数的一些基本信息及其典型应用场景示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值