php – 模型参数设置最佳实践?
我有一个模型在SQL中运行一系列条件的查询.因此,该模型需要接受许多参数,即:
this->model_name->method($param1,$param2,... ) 在模型方面,我通常将其设置为 function method($param1 = NULL,$param2 = NULL,... ) 每个参数都是可选的,用例会因应用程序而异.所以我的问题是:在什么时候(如果有的话)开始通过数组将这些参数传递给方法是有意义的,la: $params = [ 'param1' => 'whatever','param2' => 'whatever',... ] this->model_name->method($params) 我认为最终目标是更清晰的代码,以及更少的方法实例(null,null,$,$param),除非这是一件好事. 解决方法
大多数答案都支持数组方法(一般来说,我也同意),但我会扮演魔鬼的拥护者并列出一些负面信息:
文档不太清楚 记录函数/方法的大多数方法将单独列出该函数的参数.例如,具有基本DocBlock的函数将如下所示: /** * A function that accepts an array of params * @param array $param_array An array of key=>value arguments */ function accept_array($param_array = array('key1' => 'first_val','key2' => 'second_val')) { var_dump($param_array); } 注意DocBlock如何不直接支持$param_array的各个部分,只是整个数组.相反,单独列出所有参数如下所示: /** * A function that 'normal' params * @param string $key1 First argument * @param string $key2 Second argument */ function accept_normal($key1 = 'first_val',$key2 = 'second_val') { echo $key1; echo $key2; } 如果您希望您的函数是相当自我记录的,这也是一个问题,因为在第一个示例中,您不需要在函数本身中实际列出您期望的参数. 默认值可能无法按预期工作 ‘正如预期’可能是一个加载的短语(这可能是一个更明显的问题),但请采取以下措施: function accept_array($param_array = array('key1' => 'first_val','key2' => 'second_val')) { var_dump($param_array); } accept_array(array('key2' => 'a_different_val')); 有些人可能希望var_dump包含key1的默认值和key2的新值,但是整个数组都会被替换,这意味着您需要记住在每个函数中手动为每个键设置默认值,如下所示: function accept_array($param_array = array()) { if (!isset($param_array['key1'])) { $param_array['key1'] = 'first_val'; } if (!isset($param_array['key2'])) { $param_array['key2'] = 'second_val'; } var_dump($param_array); } accept_array(array('key2' => 'a_different_val')); 没有自动过滤 列出“普通”方式的参数也为您提供了一组内置的过滤器.以此快速而脏的用户搜索为例: /** * We want to allow searching for users by user_id or email only! * @param array $param_array */ function find_user($param_array = array('user_id' => 0,'email' => '')) { foreach ($param_array as $field => $value) { $this->db->or_where($field,$value); } $this->db->get('users'); } find_user(array('first_name' => 'Joe','last_name' => 'Bloggs')); 如果不在$param_array上手动添加一些“接受的密钥”类型验证,对find_user()函数的调用基本上可以使用它喜欢的任何字段.更简单的版本显然看起来像这样: /** * We want to allow searching for users by user_id or email only! * @param int $user_id * @param string $email */ function find_user($user_id = 0,$email = '') { $this->db->or_where('user_id',$user_id); $this->db->or_where('email',$email); $this->db->get('users'); } // No way for me to submit any other fields,they'll just fail when they get to the query find_user('Joe','Bloggs')); 我接受其中一些是入门级的,可能还有更多我错过了(随意评论更多,我会将它们复制到回复中),但希望有足够的让人们三思而后行自动使用’数组方法’而不考虑手动验证和文档等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |