从高处开始,我一直在研究的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函数如何期望来自用户的多个参数。有没有办法在函数的契约中指定,以便用户知道要查找的内容,或者他们是否被迫阅读方法来查找?
答案 0 :(得分:1)
使用phpDocumentor的@param
语法在方法文档中提及它。它将在您生成文档时显示,并在开发人员的IDE中显示,此时将使用该方法。
将参数名称写为$paramn,...
,并在描述中写明可以有任意数量的参数。