【发布时间】:2015-12-19 11:30:57
【问题描述】:
在 wpdb-class 的天才函数“准备”中(在 includes/wp-dp.php 中)我无法解释为什么需要isset( $args[0] )。
已经清楚的是1 < func_num_args() 然后第一个条目被移动。它仍然是0 < func_num_args(),因此必须存在第一个条目。 $args[0] 可以是NULL,但如果是这样,它就不能是一个数组,它在同一个“if”if ( isset( $args[0] ) && is_array($args[0]) ) 中进行测试。
那么我错过了什么?
function prepare( $query, $args = null ) {
if ( is_null( $query ) )
return;
if ( func_num_args() < 2 )
_doing_it_wrong( 'wpdb::prepare', 'wpdb::prepare() requires at least two arguments.', '3.5' );
$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[0] ) && is_array($args[0]) )
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
array_walk( $args, array( $this, 'escape_by_ref' ) );
return @vsprintf( $query, $args );
}
【问题讨论】:
-
WordPress 的代码并不是分析“为什么要这样做”的最佳选择,因为它充满了不需要或很糟糕的代码。不要误会我的意思,WordPress 作为一个工具很棒——但代码不是。整个
func_get_args()方法是草率且不必要的 - 就像很多 WordPress 核心代码一样。 -
您更喜欢哪种方法来获得相同的功能?