PHP - 处理空函数/方法参数的最佳方法是什么?

时间:2018-05-07 11:38:59

标签: php function methods arguments

我在我正在创建的类中有下面的函数/方法,我只是想知道处理空/空参数的最佳方法是什么。

例如,在下面的示例中,如果我只想在调用函数时只设置类别,我需要使用:

typedef void (*AddFunction)(const row_t&); std::unordered_map<int, AddFunction> add_function_map; // Outside the loop, populate the map: add_function_map[0] = add_0_to_database; add_function_map[1] = add_1_to_database; // Rest of add_function_map population elided. // The loop is now short and sweet. for (auto& x : message_map) // Note the use of auto& to avoid copying. { int message_type = x.first; std::vector<row_t>& message_rows = x.second; // Avoid copying! AddFunction add_to_database = add_function_map[message_type]; for (row_t& row : message_rows) // Avoid copying! { // LARGE CODE CHUNK add_to_database (row); } }

有没有办法更有效地调用该功能?我知道我可以将参数作为数组传递,但只是想知道是否有任何方法可以做类似的事情:

$data = $class->get_top_headlines( null, 'technology' );并自动将其他参数保留为$data = $class->get_top_headlines( $category='technology' );的默认值?

null

3 个答案:

答案 0 :(得分:1)

尝试传递数组,然后使用array_merge

$data = $class->get_top_headlines(['category' => 'technology']);

然后在你的函数中,有一个默认值数组,然后进行合并。

$settings = array_merge($settings, $passedInArray);

http://php.net/manual/en/function.array-merge.php

答案 1 :(得分:1)

我认为

(null, 'technology' );

可能不是实际编码,但不同的解决方案可能是使用OOP。你说它已经是一个类的方法所以你可以做类似的事情:

$obj = new thatClass;
$obj->technology = $technology;
$obj->get_top_headlines();

在班级中:

Class thatClass{
   $technology = null;
   $category = null;
   $query = null;
   //...
   public function get_top_headlines(){
    if ( $this->query !== null ){
        $params['q'] = urlencode( $this->query );
    }
    if ( $this->category !== null ){
        $params['category'] = $this->category;
    }
    if ( $this->technology !== null ){
        $params['technology'] = $this->technology;
    }
    //method code..
   }
   //class code..
}

这种方法的问题是如果你需要再次调用同一个函数在同一个类实例中传递一个不同的参数,这取决于你的应用程序,你可能需要手动设置回null以前的参数(现在是一个对象属性)

答案 2 :(得分:1)

我会通过创建一个新的类或数据结构来解决这个问题,该结构将封装验证和生成URL的所有逻辑,然后在我需要的任何地方使用它。

这是一个示例类。

foreach (var prop in objectName) {
    mySearcher.PropertiesToLoad.Add(prop.Key);
}

你只传递一个参数,你知道它只是HeadLineParameters的一个实例。

class HeadLineParameters
{
    private $params = [];

    public function setQuery($query)
    {
        // validate/transform query data
        $this->params['q'] = urlencode($query);
        return $this;
    }

    public function setCategory($category)
    {
        // validate/transform category data
        $this->params['category'] = $category;
        return $this;
    }

    public function generateUrl()
    {
        return http_build_query( $this->params );
    }
}

$params = new HeadLineParameters;
$params->setQuery($query)
    ->setCategory($category);

此解决方案不会使用不必要的状态或字段污染当前类。它很容易测试,只有一个工作。您可以轻松扩展它,您可以设置默认值,也可以根据需要进行验证。

编辑:为什么不应该向当前班级添加更多字段?

如果您向当前类添加更多字段,您将违反单一责任原则,此类的任何方法也可以更改这些字段。如果这些字段确实属于那些并且更多方法需要它们,那应该不是问题。如果您使用OOP,这很好。

我不确定其他人如何考虑将关联数组传递给函数,但如果没有可用的文档,则很难处理。在阅读一些外部代码时我遇到了麻烦,大多数时候我不确定我处理的数据是什么。