读取函数中参数的最佳方法是什么?

时间:2010-10-06 23:55:29

标签: php wordpress

我创建了几个帮助函数,我在为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

3 个答案:

答案 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"));