我创建了几个帮助函数,我在为Wordpress创建模板时使用它们。 一个例子是:
function the_related_image_scaled($w="150", $h="150", $cropratio="1:1", $alt="", $key="related" )
问题是,如果我只想传递$alt
参数,我还必须填充$w
,$h
和$cropratio
。
在我的一个插件中,我使用以下代码:
function shortcode_display_event($attr) {
extract(shortcode_atts(array(
'type' => 'simple',
'parent_id' => '',
'category' => 'Default',
'count' => '10',
'link' => ''
), $attr));
$ec->displayCalendarList($data);
}
这允许我仅使用例如count=30
来调用该函数。
如何在自己的功能中实现同样的目标?
解
感谢我的兄弟(steven_desu),我提出了一个有效的解决方案。
我添加了一个额外的功能(我在网上找到)来创建一个字符串的值对。
代码如下:
// This turns the string 'intro=mini, read_more=false' into a value - pair array
function pairstr2Arr ($str, $separator='=', $delim=',') {
$elems = explode($delim, $str);
foreach( $elems as $elem => $val ) {
$val = trim($val);
$nameVal[] = explode($separator, $val);
$arr[trim(strtolower($nameVal[$elem][0]))] = trim($nameVal[$elem][1]);
}
return $arr;
}
function some_name($attr) {
$attr = pairstr2Arr($attr);
$result = array_merge(array(
'intro' => 'main',
'num_words' => '20',
'read_more' => 'true',
'link_text' => __('Read more')
), $attr);
extract($result);
// $intro will no longer contain'main' but will contain 'mini'
echo $intro;
}
some_name('intro=mini, read_more=false')
信息
有了Pekka的良好反馈,我用Google搜索并找到了有关命名参数的一些信息以及为什么它不在PHP中:http://www.seoegghead.com/software/php-parameter-skipping-and-named-parameters.seo
答案 0 :(得分:1)
我建议在函数开头使用array_merge()
和extract()
,然后在可能的情况下将参数作为数组传递。
function whatever($new_values){
$result = array_merge(array(
"var1" => "value1",
"var2" => "value2",
"var3" => "value3"
), $new_values);
extract($result);
echo "$var1, $var2, $var3";
}
whatever(array("var2"=>"new_value"));
以上将输出:
value1, new_value, value3
由于它必须分配数组,因此它有点草率并且使用更多内存,所以它是效率较低的解决方案。但它确实可以避免冗余。我确信使用魔法元代码存在更好的方法,但我无法想到它。
答案 1 :(得分:0)
新答案:
你能不能使用提取函数的默认EXTR_OVERWRITE
选项编写函数?
function the_related_image_scaled($params) {
$w="150"; $h="150"; $cropratio="1:1"; $alt=""; $key="related";
extract($params);
//Do Stuff
}
跟:
the_Related_image_scaled(array("alt"=>"Alt Text"));
您可以选择将参数默认为null,并且只有在它们不为空时才使用它们:
function the_related_image_scaled($w=null, $h=null, $cropratio=null, $alt=null, $key = null) {
$output = //Get the base of the image tag
//including src leave a trailing space and don't close
if($w!==null) {
$output .= "width=\"$w\"";
}
//... Through all your parameters
return $output;
}
所以只传递alt参数看起来像:
echo the_related_image_scaled(null,null,null,$alt);
答案 2 :(得分:0)
说这是你的功能:
function related_image_scaled($w="150", $h="150", $alt="", $key="related")
你可以这样做:
class ImageScaleParams {
public $w = 150;
public $h = 150;
public $cropratio = "1:1";
public $alt = "";
public $key = "related";
}
function related_image_scaled(ImageScaleParams $params) { ... }
然后这样称呼:
$imgscale = new ImageScaleParams();
$imgscale.alt="New Alt";
related_image_scaled($imgscale);
您还可以在ImageScaleParams中拥有各种工厂,例如:
class ImageScaleParams {
static function altFactory($alt) {
$imgscale = new ImageScaleParams();
$imgscale->alt = $alt;
return $imgscale;
}
}
您可以这样调用(相当于上一个示例):
related_image_scaled(ImageScaleParams::altFactory("New Alt"));