如何编写一个有更多参数的函数?

时间:2016-12-18 09:45:16

标签: php function parameter-passing

我有这样的功能:

public function myfunc ($arg1, $arg2, $arg3, $arg4, $arg5, $arg6, $arg7, $arg8) {
    // do something
}

请参阅?我的函数有8个参数。是的它也有效,但是你知道,这有点难看......难道没有更好的主意吗?例如,只传递一个数组包含所有参数。可能吗?甚至类似的东西。

3 个答案:

答案 0 :(得分:0)

我这样做..

$params = [];

把东西放在params ..

$params[] = $a;
$params[] = $b;

将数组传递给函数

myFunction($params);

函数accept array as arg like,definition:

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

传递内容,并使用var_dump来检查自己......

答案 1 :(得分:0)

好的,现在我知道它是您正在进行的SQL操作,然后最好的方法是关联数组(假设PDO和预处理语句)。

public function myFunc (array $data)
{
    // Using 3 values for example!
    $stmt = $this -> pdo -> prepare ("INSERT INTO TABLE thisTable (
        col1, 
        col2, 
        col3
    ) VALUES (
        :val1, 
        :val2, 
        :val3
    )");

    if (false !== $stmt execute ($data))
    {
        return $stmt -> rowCount ();
    } else {
        return 0;
    }
}

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

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

答案 2 :(得分:0)

取决于myfunc是否属于暴露的api(即:public)

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

使用数组,您可能无法将模型映射到应用程序,并且只是期望程序员向您发送正确的值。通过严格/限制映射,不会发生这种错误。

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

你可以做些什么来改善你的api:

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

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

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

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