在PHP中调用函数的惯用方法是什么?

时间:2014-07-16 15:34:28

标签: php codeigniter

我是PHP和codeigniter的新手。目前,每当我编写模型函数时,我都会传递多个参数而不是单个关联数组,如下所示:

function create_user($first_name, $last_name, $username)
{
    $this->db->insert('users', array('first_name'=>$first_name,
                                     'last_name'=>$last_name,
                                     'username'=>$username));
}

而不是:

//where $user === Array('first_name'=>$first_name, 'last_name'=>$last_name, 'username'=>$username)
function create_user($user)
{
    $this->db->insert('users', $user);
}

我想知道哪一种是惯用的方式。如果两者都很好并且只是个人偏好的问题,那么我想知道哪种方法比另一种方法更受欢迎。

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为这只是个人选择。

我通常使用第二个,因为如果我必须添加或删除参数,我不想更改我的功能。

开发人员很懒,他们说:D

答案 1 :(得分:1)

这是一般答案 - 它适用于几乎所有语言。

有一个例外(想到这一点) - 这就是API的一部分应该始终采用一个数组,因为如果你想调用一个函数,这可以节省工作量在您的应用程序内或通过$_POST[] - 您可以使用相同的方法进行一些快速检查,以查看它是通过http发布的帖子还是应用程序本身传入的变量(但是很少)人们似乎还处于消费自己的API的阶段:-P)

特定于模型和CI

如果可以,请始终使用命名变量 - 这样可以降低应用程序出错的可能性。

除非你的应用程序是庞大的/真正的数据密集型(或者有可能在几天内完成这种方式),否则最好一次一个地通过模型进行多次插入以进行调试,并且不应该有任何重要的对速度的影响。

此外,这通常会使应用程序更安全,因为您可以更轻松地定义变量类型(例如,仅限数字)并以controller级别而不是model级别处理错误

一般答案

它非常依赖于函数 - 但命名变量应该始终是首选。

我会尝试解释何时使用每个: -

1。可选参数的加载数= array();

如果它是一个带有可选参数加载的函数,那么最好传入一个数组 - 但我会说不到20%的函数需要这么大的灵活性。 - >这节省了必须写

private function myFunction($a, $b = "", $c = "", $d = "", $e = "", $f = "", $g = "", $h = "");

$a = $this->myFunction("aa","","","","","","","bb");

如果您只想使用2个参数而不是

private function myFunction($arr = array());

$options = array("a"=>"aa","h"=>"bb");

$a = $this->myFunction($options);

此外,如果一个函数有那么多参数 - 它可能需要重写!

2。几个可选参数=命名变量

然而 - 如果它是一个总是需要3个变量的函数,那么你应该对它们进行硬编码,因为这样可以更容易地捕获错误(对于IDE,如果你发表评论,你应该对你的函数进行代码提示)它是正确的。)

上面带有数组的示例意味着当你有一个必须至少有 3 变量的函数时,你的IDE将不知道

$options = array("a"=>"aa","h"=>"bb");

$a = myFunction($options);

应该抛出错误。

此外,您必须编写大量不必要的检查,以查看所需的变量是否存在并设置。

3。黄金法则和中间地带

编写函数的最佳方式 - 几乎所有语言都是:

  1. 对REQUIRED字段使用命名变量。
  2. 如果您的可选值始终相互依赖(因此您需要第一个可选变量才需要第二个可选变量),然后使用$a = "", $b = ""
  3. 对于任何其他变量 - 或者对于可能只接受4/5个变量之一的函数传递给数组。
  4. 因此,复杂函数的理想情况是

    private function _complex_function($required1, 
                                       $required2,
                                       $optionThatWillAlwaysBeRequiredBeforeOtherOptions = "",  
                                       $mixAndMatchOptions = array())
    {
    }
    

    希望很清楚。