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

PHP开发日志 ━━ 深入理解三元操作与一般条件语句的不同

概况

三元运算符的功能与“if…else”流程语句一致。

在一般情况下,三元操作替换if条件语句可以精简代码,并且更为直观,但是在下面的情况中使用三元操作将会返回警告。

借图:

在这里插入图片描述

案例

比如原代码:

class classA{public static function &get_instance($param='')	{...		if(isset(self::$_instance->$param)){return self::$_instance->$param;}else{return NULL;}	}
}

而一旦改写三元操作的时候:

class classA{public static function &get_instance($param='')	{...		return isset(self::$_instance->$param) ? self::$_instance->$param : NULL;}
}

系统会提示:
PHP Notice: Only variable references should be returned by reference in...

分析

为什么呢?

  • 为什么第一种写法正确?
    • 函数声明为返回引用
    • 对象属性也是引用
    • 如果$param为空,直接返回对象实例,即返回一个对象引用
    • 否则使用if分支,每个分支都返回对象属性引用NULL,都符合引用要求
  • 为什么第二种写法出错?
    • 问题在使用三元操作符
    • 三元操作符整体返回一个值,而不是引用
    • 此时虽然内容是属性,但类型上仍是个值而不是引用
    • 所以不匹配函数声明为返回引用这个要求

总结

  • 函数声明返回引用,每个返回节点都必须返回真正的变量引用
  • 第一种用if分支,每个分支都返回引用
  • 第二种三元操作符整体返回一个值,就算内容是引用也不算
  • 所以正确应该是第一种if分支写法,而不是使用三元操作符。

NULL本身不是一个变量,所以严格来说返回NULL也不算返回变量引用。
但是NULL作为一个特殊值,它可以作为非引用值正常返回,不会报错。

在这里插入图片描述

相关文章:

  • Decian 12.x基于LNMP安装phpIPAM(IP管理系统)
  • 考研英语单词25
  • Vivado用ILA抓波形保存为CSV文件
  • sqlserver2012 解决日志大的问题
  • STM32物联网(ESP-01S模块及STM32和ESP-01S通信方式介绍)
  • 问题:成本会计工作的核心是( ) #其他#知识分享
  • Compose | UI组件(十五) | Scaffold - 脚手架
  • 虚拟dom
  • 【Python网络编程之Ping命令的实现】
  • 数据结构——5.3 二叉树的遍历和线索二叉树
  • leetcode142. 环形链表 II
  • 【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(二)-函数列表
  • 边缘计算第二版施巍松——第七章 边缘计算资源调度
  • 基于Skywalking开发分布式监控(二)
  • Spring Security学习(四)——登陆认证(包括自定义登录页)
  • canvas 绘制双线技巧
  • IP路由与转发
  • js作用域和this的理解
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP变量
  • 测试开发系类之接口自动化测试
  • 从零开始的无人驾驶 1
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对超线程几个不同角度的解释
  • 简单数学运算程序(不定期更新)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序测试方案初探
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • raise 与 raise ... from 的区别
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 达梦数据库知识点
  • #Ubuntu(修改root信息)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $.proxy和$.extend
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (day6) 319. 灯泡开关
  • (LeetCode) T14. Longest Common Prefix
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (剑指Offer)面试题34:丑数
  • (实战篇)如何缓存数据
  • (一)认识微服务
  • ***检测工具之RKHunter AIDE
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net mvc部分视图
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • ::前边啥也没有