在 WordPress 中使用尤达条件表达式防止意外赋值
作为一个程序员,写代码的时候发生拼写错误是再正常不过的事情,很多拼写错误可能造成语法错误,IDE 和解释器会提示,然后可以很快得到修改。
而一些特定的错误,比如在条件表达式中把 ==
写成 =
,这个对于 PHP 来说并不是语法问题,程序可以正常运行,但是结果却是并非自己想要,所以为了避免这类特定的错误,可以使用「尤达表达式」这种编程风格。
什么是尤达表达式
尤达表达式是一种编码的风格,在条件表达式中反转变量和常量、文字或函数的位置,举个例子:
// 正常的写法
if ( $post_type == 'post' ) { /* code */ }
// 尤达表达式
if ( 'post' == $post_type ) { /* code */ }
这种风格的命名,来源于星球大战的一个角色,绝地大师尤达(Yoda)
,剧中尤达
喜欢以颠倒的语序说英语,比如“当九百岁你活到,看起来很好你将不”
。
为什么要用尤达表达式
尤达表达式主要用于捕捉编写程序意外引起的错误。
例如以下判断,由于判断相等少写了一个=
号,导致程序运行中发生意外的赋值操作:
// 拼写错误,不小心把 == 写成了 =
if ( $post_type = 'post' ) { /* code */ }
当上面的代码运行时,执行如下:
- 把值
'post'
赋值给变量$post_type
. - 然后
if
条件判断为 true. - 大括号中的代码被执行
本来是打算判断一下变量 $post_type
的值是不是 'post'
,一不小心,变成了赋值,这样就改变了预期的行为导致 if
代码块每次都执行。而实际上如果 $post_type
的值不是 'post'
的情况,是不执行的。
而使用尤达表达式,则可以在第一次测试时就捕捉到错误:
if ( 'post' = $post_type ) { /* code */ }
// Parse error: syntax error, unexpected '=' in xxx.php on line n
尤达表达式将值写在条件的左侧,可以防止意外地将值赋值给变量,因为无法对值进行赋值。
所以尤达表达式还是很有帮助的,但是它的缺点也很明显,与常规的编程直线思维相悖,造成代码阅读和理解上的不顺畅,缺乏可读性。
WordPress 和尤达表达式
WordPress 的 PHP 编码规范是支持尤达表达式的用法,因为当时 PHP 世界几乎没有任何静态分析工具可用,防止在条件表达式中意外赋值的唯一“万无一失”的方法是反转被检查的值和变量的顺序。
但是最新的 WordPress 的 PHP 编码规范开始讨论不推荐使用尤达表达式,进一步将禁止。因为目前代码静态分析工具已经成熟,可以在代码分析阶段设置禁止在条件表达式中赋值的规范来防止意外赋值。当然目前还是提案阶段,具体还朝哪个方向还在讨论中。