3

我正在创建一个大型 PHP 项目,但我对如何进行有一点疑问。

假设我们有一个类books,在这个类中我有方法ReturnInfo

function ReturnInfo($id) {
    if( is_numeric($id) ) {
        $query = "SELECT * FROM books WHERE id='" . $id . "' LIMIT 1;";

        if( $row = $this->DBDrive->ExecuteQuery($query, $FetchResults=TRUE) )   {  
                return $row;
        } else {
            return FALSE;
        }
    } else {
        throw new Exception('Books - ReturnInfo - id not valid.');          
    }
}

然后我有另一种方法PrintInfo

function PrintInfo($id) {
    print_r( $this->ReturnInfo($id) );
}

显然,代码示例只是示例,而不是实际的生产代码。

在第二种方法中,我应该(再次)检查 id 是否为数字?或者我可以跳过它,因为在第一种方法中已经注意了,如果不是异常就会抛出?

到目前为止,我总是用冗余检查编写代码(无论是否已经在其他地方检查过,我也会在这里检查)

有最佳实践吗?只是常识吗?

预先感谢您的友好答复。

4

2 回答 2

5

好吧,问问自己通过检查每一层可以获得什么。是不是更安全?不,因为使用该值的函数是唯一易受攻击的函数,它自己进行检查。

它的唯一优点是您可以更早地停止无效值,从而执行更少的代码。在您知道该值无效之前,它不必一直向下并备份。这可能是也可能不是真正的优势。

但它确实会产生问题:你有更多的代码。您的代码不再是 DRY。如果您更改“有效”值的定义,则必须更改所有地方的检查。这些都是更大的问题。

我会以这种方式解决问题:您的核心业务模型会进行详细检查,它最终负责确保该值是有效的,并且它是唯一对这个值做“危险”事情的人。外层(控制器、视图)只是传递值。除了一个例外:他们可能会进行“粗略”的数据验证。假设您的模型需要具有特定格式的电话号码。您应该在模型中检查此特定规则。在视图/控制器层中,您可以粗略地验证该值至少有点数字。比如说,你有一个 Javascript 检查。这可以阻止明显错误的值干扰您的核心应用程序,同时仍然让您可以灵活地在一个地方调整核心验证规则。

于 2012-12-18T15:40:25.097 回答
0

除非您在连续执行数千次的循环内仔细检查返回,否则您甚至不会注意到冗余检查。即便如此,类型检查是一个非常小的操作,并且比用于检索示例中的数据的 SQL 查询快几个数量级。

除非您真的为实时应用程序压缩 CPU 周期,否则您可能会享受额外检查为您提供的 ass-coverage。

也就是说,您的函数通常应该比其输出更严格或更严格地验证其输入,因此您将编写像这样的额外冗余检查的唯一地方是一些需要严格输入/验证的内联功能。

于 2012-12-18T17:02:15.613 回答