覆盖函数调用上的Array值

时间:2014-05-29 11:47:50

标签: php

我正在使用CodeIgnitor,我有一个定义了数组的类,它具有默认设置,但我希望能够调用其中一个函数并替换一个或多个Array值,如下所示:

在模型中我有:

class Search {
    var $items = array("limit" => 10, "query"=>"foobars");

    function dosearch($items) {
        ...
   }

}

然后从控制器中调用它......

$this->load->model('search_model');
$items = array("limit"=>100);
$this->search_model->dosearch($items);

要清楚,我只想覆盖一些Model Class Array值,并保留其余部分。

我怎样才能做到最好?

感谢。

3 个答案:

答案 0 :(得分:1)

我想这就是你要找的东西:

扩展您的方法实现,如下所示:

class Search {
    var $items = array("limit" => 10, "query"=>"foobars");

    function dosearch($override=array()) {
        // maybe first some general plausibility checks inside $override...
        if ( ! is_array($override) )
            return FALSE; // better to throw an exception here!
        // make a copy of $this->items you can modify:
        $innerItems = $this->items;
        // then use values inside $override
        foreach ($override as $key=>value) {
            // then some specialized plausibility checks, for example: 
            if ( ! in_array($key, array('limit','query') )
                continue;
            // is 'limit' a valid integer inside the range ]0,100]?
            if ( ('limit'==$key) && (0<(int)$value) && (100>=(int)$value) )
                $value=(int)$value;
            else 
                continue;
            // all fine, use override value
            $innerItems[$key] = $value;
        }
        // now do whatever you want with $innerItems
        // ...
   }    
}

然后你可以在运行时这样做:

$this->load->model('search_model');
$items = array("limit"=>100);
$this->search_model->dosearch($items);

请注意,我没有对此进行测试,只是将其写下来。我希望其中没有遗留下的小错误; - )

答案 1 :(得分:0)

您想要用新的数组替换$this->items数组还是只更改键的值?在您的示例中,您正在更改整个阵列。如果您只想更改一个密钥,请执行此操作$this->items['limit'] = 100

答案 2 :(得分:0)

好的,我制定了一个非常优雅的解决方案,适用于CodeIgnitor。

创建配置文件,我们称之为defaultdata.php并添加您的默认数据。

$config['searchData'] = array("limit"=>10, "query"=>"foobar");

然后在你的Controller中添加:

$this->config->load('defaultdata');
$this->load->model('dostuff_model');

$temp = $this->config->item('searchData');

$temp["limit"] = 100;
$data = $this->dostuff_model->search($temp);
...

然后你已经为这个电话修改了完整的阵列准备好了! BOOM !!!!!

感谢您对上述人员的回复,这让我想到了这一点。