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

概况

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

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

借图:

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

案例

比如原代码:

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作为一个特殊值,它可以作为非引用值正常返回,不会报错。

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

你可能感兴趣的:(PHP,php,android,开发语言,三元运算符,三元,if,条件语句)