如何在PHP中向调用者表示函数接受可变数量的参数?

时间:2011-11-21 11:17:54

标签: php

从高处开始,我一直在研究的webapp需要转移到存储过程,以便在数据库中执行它所做的一切。为此,我通过在mysqli之上编写一个新的数据库层来强制执行该约束,该数据库层仅公开“允许”行为。考虑到目前为止我所拥有的:

class Cas_Database
{
    private $mysqli;
    private $mode;

    public function __construct(...)
    {
    ... //Ommitted
    }

    public function Transaction(/* callable */ $func)
    {
        $mysqli->autocommit(false);
        try
        {
            $func($this);
            $mysqli->commit();
            $mysqli->autocommit(true);
        }
        catch (Exception $ex)
        {
            $mysqli->rollback();
            $mysqli->autocommit(true);
            throw $ex;
        }
    }

    public function MultiProcedure($schema, $func)
    {
        $args = func_num_args() - 2;
        $sql = "CALL `{$this->mode}_{$schema}`.`{$func}` (";
        if ($args >= 1)
        {
            $sql .= '? ';
            for ($idx = 1; $idx < $args; ++$idx)
            {
                $sql .= ', ?';
            }
        }
        $sql .= ')';
        $stmt = $mysqli->prepare($sql);
        $typeStr = '';
        $refArgs = array(null);
        for ($idx = 0; $idx < $args; ++$idx)
        {
            $argIndex = $idx + 2;
            $arg = func_get_arg($argIndex);
            $refArgs[] = &$arg;
            if (is_int($arg))
            {
                $typeStr .= 'i';
            }
            else if (is_float($arg))
            {
                $typeStr .= 'f';
            }
            else
            {
                $typeStr .= 's';
            }
        }
        $refArgs[0] = $typeStr;
        call_user_func_array(array($stmt, 'bind_param'), $refArgs);
        if ($stmt->execute() !== true)
        {
            $error = $stmt->error;
            $stmt->close();
            throw new Exception($error);
        }
        $mysqlAnswer = $stmt->get_result();
        $results = array();
        while (($answerRow = $mysqlAnswer->fetch_assoc()) !== null)
        {
            $results[] = $answerRow;
        }
        $stmt->close();
        return $results;
    }
}

注意MultiProcedure函数如何期望来自用户的多个参数。有没有办法在函数的契约中指定,以便用户知道要查找的内容,或者他们是否被迫阅读方法来查找?

1 个答案:

答案 0 :(得分:1)

使用phpDocumentor的@param语法在方法文档中提及它。它将在您生成文档时显示,并在开发人员的IDE中显示,此时将使用该方法。

将参数名称写为$paramn,...,并在描述中写明可以有任意数量的参数。