详解WordPress中用于合成数组的wp_parse_args()函数
wp_parse_args()函数是WordPress核心经常用到的函数,它的用途很多,但最主要用来给一个数组参数(args)绑定默认值。
因为wp_parse_args()函数返回的一定是一个数组,所以他会把传入查询字符串和对象(object)自动转换成数组,给了使用者更加方便的条件,也增加了兼容性。
常见的query_posts()、wp_list_comments()和get_terms()函数都使用了wp_parse_args()函数来帮它给数组参数添加默认值。
用法
wp_parse_args($args,$defaults);
参数
$args
(数组|字符串)(必须)查询字符串、对象或者数组参数,用来绑定默认值。
默认值:None
查询字符串:
type=post&posts_per_page=5&cat=1
数组:
array('type'=>'post','posts_per_page'=>5,'cat'=>'1')
$defaults
(数组)(可选)数组参数的默认参数。
默认值:空字符串
例子
functionexplain_parse_args($args=array()){
//$args的默认值
$defaults=array(
'before'=>'<divclass="box">',
'after'=>'</div>',
'echo'=>true,
'text'=>'wp_parse_args()函数演示'
);
//绑定默认值
$r=wp_parse_args($args,$defaults);
$output=$r['before'].$r['text'].$r['after'];
if(!$r['echo'])return$output;
echo$output;
}
//没有参数
explain_parse_args();//打印:<divclass="box">wp_parse_args()函数演示</div>
//字符串参数
$output=explain_parse_args('text=字符串参数&before=<divclass="box-2">&echo=0');
echo$output;//打印:<divclass="box-2">字符串参数</div>
//数组参数
explain_parse_args(array('text'=>'数组参数','before'=>'<divclass="box-3">'));//打印:<divclass="box-3">数组参数</div>
还有另一种不使用第二个$defaults参数的用法,就是帮你把一个查询字符串、对象或者数组的变量直接转换成通用的数组,避免判断类型。
//字符串
$array=wp_parse_args('text=测试另一种用法&type=字符串');
var_dump($array);
/*
array(2){
["text"]=>
string(21)"测试另一种用法"
["type"]=>
string(9)"字符串"
}
*/
//对象(object)
classargs_obj{
public$text='测试另一种用法';
public$type='对象(object)';
functionfunc(){
//转换成数组的时候对象里边的函数会被忽略
}
}
$obj=newargs_obj;
var_dump($obj);
/*
object(args_obj)#2175(2){
["text"]=>
string(21)"测试另一种用法"
["type"]=>
string(18)"对象(object)"
}
*/
wp_parse_args函数源代码详解
wp_parse_args函数的源代码比较简单,
依附于PHP内置函数get_object_vars、array_merge与WordPress的wp_parse_str函数来实现,
以下是该函数的源代码:
/**
*Mergeuserdefinedargumentsintodefaultsarray.
*
*ThisfunctionisusedthroughoutWordPresstoallowforbothstringorarray
*tobemergedintoanotherarray.
*
*@since2.2.0
*
*第一个参数可以是字符串、数组或对象(obj)
*@paramstring|array$argsValuetomergewith$defaults
*第二个参数为默认的预设值数组,必须是数组
*@paramarray$defaultsArraythatservesasthedefaults.
*返回值将是一个数组
*@returnarrayMergeduserdefinedvalueswithdefaults.
*/
functionwp_parse_args($args,$defaults=''){
if(is_object($args))
//将接收的对象(obj)转换为数组
$r=get_object_vars($args);
elseif(is_array($args))
//如果是数组则不转换
$r=&$args;
else
//将接收的字符串转换为数组
wp_parse_str($args,$r);
if(is_array($defaults))
returnarray_merge($defaults,$r);
return$r;
}
其中get_object_vars函数是用来返回由对象属性组成的关联数组。
array_merge函数用是将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。