概况
三元运算符的功能与“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作为一个特殊值,它可以作为非引用值正常返回,不会报错。