Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何才能更好地编写具有大量参数的函数?_Php_Function_Parameter Passing - Fatal编程技术网

Php 如何才能更好地编写具有大量参数的函数?

Php 如何才能更好地编写具有大量参数的函数?,php,function,parameter-passing,Php,Function,Parameter Passing,我有这样一个函数: public function myfunc ($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8) { // do something } 看到了吗?我的函数有8个参数。是的,它也很管用,但你知道,它有点难看。。!难道没有更好的办法吗?例如,只传递一个数组就包含所有参数。可能吗?甚至类似的东西。我是这样做的 $params = []; 把东西放进去 $params[] = $a; $params[] =

我有这样一个函数:

public function myfunc ($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8) {
    // do something
}
看到了吗?我的函数有8个参数。是的,它也很管用,但你知道,它有点难看。。!难道没有更好的办法吗?例如,只传递一个数组就包含所有参数。可能吗?甚至类似的东西。

我是这样做的

$params = [];
把东西放进去

$params[] = $a;
$params[] = $b;
将数组传递给函数

myFunction($params);
函数接受类似arg的数组,定义:

public function myFunction($params = []){}
把东西传进来,然后自己检查一下…

我是这样做的

$params = [];
把东西放进去

$params[] = $a;
$params[] = $b;
将数组传递给函数

myFunction($params);
函数接受类似arg的数组,定义:

public function myFunction($params = []){}

传入一些内容,然后使用var_dump检查您自己…

好的,现在我知道您正在执行的是SQL操作,那么最好的方法是关联数组(假设PDO和准备好的语句)

您可以使用包含正确参数的数组调用它:

$success = (bool) $obj -> myFunc (["val1" => "First value to insert",
                                   "val2" => "Second value to insert",
                                   "val3" => "Third value to insert"]);

好的,现在我知道您正在执行的是SQL操作,那么最好的方法是关联数组(假设PDO和准备好的语句)

您可以使用包含正确参数的数组调用它:

$success = (bool) $obj -> myFunc (["val1" => "First value to insert",
                                   "val2" => "Second value to insert",
                                   "val3" => "Third value to insert"]);

这取决于
myfunc
是否属于公开的api(即:public)

如果是公共的,则在更新基础模型(插入查询)时签名必须断开,否则将在客户端提交错误

有了数组,您就无法将模型映射到应用程序,而您只希望程序员向您发送正确的值。如果映射紧密/受限,则不会发生此类错误

我认为,如果要在数据库中保存项目,实际上需要所有这些字段。这确实是不合法的,但它不是反模式,因为它们都不是可选的。即使有一两个是,也不会引起关注

您可以采取以下措施来改进api:

  • 如果存在只需要传递少数参数的情况(即大多数参数是可选的或取决于特定场景),则可以将该方法专门化为单独的函数。但是PHP不接受函数多态性对于这类事情来说是一件非常痛苦的事情;您必须以不同的方式命名这些方法

    public function myfunctosavedatainaparticularcase ($arg1, $arg2, $arg3, $arg4) 
        // do something
    }
    
    public function myfunctosavedatainanotherparticularcase ($arg5, $arg6, $arg7, $arg8) 
        // do something
    }
    
  • 使用对象模型映射器。例如,假设您正在保存用户数据。您只需将一个用户对象传递给该方法:

    public function myfunc (User $user) 
        // map fields to the User signature.
    }
    
  • 如果您控制用户类,这是可以接受的,因为您必须更改它以反映模型更改

  • 使用ORM为您处理此问题。您只需在决定更改数据库模型后更新模式的xml规范,所有必要的更改都会自动传播到应用程序。当然,对象的定义会改变,但这是不可避免的

  • 这取决于
    myfunc
    是否属于公开的api(即:public)

    如果是公共的,则在更新基础模型(插入查询)时签名必须断开,否则将在客户端提交错误

    有了数组,您就无法将模型映射到应用程序,而您只希望程序员向您发送正确的值。如果映射紧密/受限,则不会发生此类错误

    我认为,如果要在数据库中保存项目,实际上需要所有这些字段。这确实是不合法的,但它不是反模式,因为它们都不是可选的。即使有一两个是,也不会引起关注

    您可以采取以下措施来改进api:

  • 如果存在只需要传递少数参数的情况(即大多数参数是可选的或取决于特定场景),则可以将该方法专门化为单独的函数。但是PHP不接受函数多态性对于这类事情来说是一件非常痛苦的事情;您必须以不同的方式命名这些方法

    public function myfunctosavedatainaparticularcase ($arg1, $arg2, $arg3, $arg4) 
        // do something
    }
    
    public function myfunctosavedatainanotherparticularcase ($arg5, $arg6, $arg7, $arg8) 
        // do something
    }
    
  • 使用对象模型映射器。例如,假设您正在保存用户数据。您只需将一个用户对象传递给该方法:

    public function myfunc (User $user) 
        // map fields to the User signature.
    }
    
  • 如果您控制用户类,这是可以接受的,因为您必须更改它以反映模型更改

  • 使用ORM为您处理此问题。您只需在决定更改数据库模型后更新模式的xml规范,所有必要的更改都会自动传播到应用程序。当然,对象的定义会改变,但这是不可避免的

  • func\u get\u args()
    您可以使用数组作为参数。对于试图做太多事情的函数来说,大量参数是一种代码味道。问自己几个问题:你的函数是否有超过20行的代码?它是否有超过2级的缩进?它是否包含3个以上的if/case/conditional语句?在循环中有循环吗?如果其中任何一个答案都是肯定的,那么如果将代码重构为多个函数而不是单个函数,那么您的代码可能会更好one@Mohammad只有当一系列相似的事情必须以相似的方式处理时,才应该这样做。你不应该用它来缩短参数列表@MartinAJ在这种情况下,关联数组是一个合适的参数(当然假设有一个准备好的语句!)
    func\u get\u args()
    您可以使用数组作为参数。对于一个试图做太多事情的函数来说,大量参数是一种代码味道。问自己几个问题:你的函数是否有超过20行的代码?它是否有超过2级的缩进?它是否包含3个以上的if/case/conditional语句?在循环中有循环吗?如果其中任何一个答案都是肯定的,那么如果将代码重构为多个函数而不是单个函数,那么您的代码可能会更好one@Mohammad只有当它是一系列类似的东西时,你才应该这样做