当前位置: 首页 > news >正文

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已赋值,且不为空。
 

http://www.lryc.cn/news/129853.html

相关文章:

  • 星火大模型 VS FuncGPT(慧函数), 谁更胜一筹?
  • 使用 Python 获取 Redis 数据库中的所有键
  • C的进阶C++学习方向
  • 【仿写框架之仿写Tomact】二、初始化阶段加载项目中所有servlet类对象
  • Linux实用运维脚本分享
  • JMeter 特殊组件-逻辑控制器与BeanShell PreProcessor 使用示例
  • 时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测
  • Ubuntu 连接海康智能相机步骤(亲测,成功读码)
  • sass笔记
  • C/C++中volatile关键字详解
  • Linux:shell脚本:基础使用(4)《正则表达式-grep工具》
  • 如何建立单元测试
  • typeScript 接口和类
  • 这项与越来越多企业有关的行业标准,网易云信深度参与制定!
  • C语言,malloc使用规范
  • 广度优先遍历与最短路径(Java 实例代码源码包下载)
  • 南大通用数据库(Gbase 8s) 创建UDR外部函数
  • 步入React正殿 - State进阶
  • 【QT+ffmpeg】QT+ffmpeg 环境搭建
  • 责任链模式解决多个ifelse问题
  • Lnton羚通关于PyTorch的保存和加载模型基础知识
  • python+django+mysql项目实践四(信息修改+用户登陆)
  • sCrypt编程马拉松于8月13日在复旦大学成功举办
  • Selenium手动和自动两种方式启动Chrome驱动
  • 《PostgreSQL 开发指南》第32篇 物化视图
  • 【RocketMQ】快速入门
  • AB跳转轮询:让你的独立站收款智能化
  • 所有用户都能使用sudo吗
  • 【广州华锐视点】VR警务教育实训系统模拟真实场景进行实践训练
  • 【深入浅出C#】章节 7: 文件和输入输出操作:处理文本和二进制数据