Php 动态类型和API“;断路器;

Php 动态类型和API“;断路器;,php,dynamic-typing,Php,Dynamic Typing,我知道这个标题似乎很神秘,也许是的。这几乎是一个进退两难的局面。我正在开发一个用于研究目的的框架(可能是专业的),然后我打算联合开发一个文档,解释项目中的所有属性和方法 文档应该说明sum()方法必须采用两个整数参数。例如: /** * Sum two numbers. * @param int $a * @param int $b * @return int */ function sum($a, $b) { return $a + $b; } function sum($

我知道这个标题似乎很神秘,也许是的。这几乎是一个进退两难的局面。我正在开发一个用于研究目的的框架(可能是专业的),然后我打算联合开发一个文档,解释项目中的所有属性和方法

文档应该说明
sum()
方法必须采用两个整数参数。例如:

/**
 * Sum two numbers.
 * @param int $a
 * @param int $b
 * @return int
 */
function sum($a, $b) {
    return $a + $b;
}
function sum($a, $b) {
    throwErrorIfNotMatchType($a, "int");
    throwErrorIfNotMatchType($b, "string");

    return $a + $b;
}
但问题是,如果用户John Doe决定发送错误类型的信息(不管为什么,可能是因为他们没有阅读文档),我应该如何处理错误?我应该让PHP得到这份工作(在某些情况下,它可以恰巧完美地运行代码),还是手动检查并抛出我自己的错误,这样就不会出现这种巧合?例如:

/**
 * Sum two numbers.
 * @param int $a
 * @param int $b
 * @return int
 */
function sum($a, $b) {
    return $a + $b;
}
function sum($a, $b) {
    throwErrorIfNotMatchType($a, "int");
    throwErrorIfNotMatchType($b, "string");

    return $a + $b;
}

简言之,控制错误和巧合的责任必须完全由API管理,或者完全由用户负责(用户应该已经阅读了现有文档),或者应该部分控制?对于最后一个答案,在什么情况下?

类型检查需要CPU—这是事实。所以你需要选择你的毒药

  • 要么速度较慢,但类型更安全
  • 或者更快,但类型安全性更低
一些API选择了两者兼备,让消费者选择毒药,我的意思是:

/**
 * Sum two numbers, without checking types.
 * @param int $a
 * @param int $b
 * @return int
 */
function sum($a, $b) {
    return $a + $b;
}


/**
 * Sum two numbers, throw if checking types fails
 * @param int $a
 * @param int $b
 * @return int
 */
function ts_sum($a, $b) {
    throwErrorIfNotMatchType($a, "int");
    throwErrorIfNotMatchType($b, "int");
    return sum($a, $b);
}

现在最聪明的部分是,可以从第一个版本加上文档注释自动生成第二个版本。

或者可以使用
DEBUG
常量来运行类型检查。检查DEBUG常量需要CPU时间-目标是在快速路径中尽可能快。随着应用程序的成熟,您通常可以停用typesafe API,并在生产中使用非typesafe API运行。