Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP理论-类内或类外的错误检查?_Php_Oop - Fatal编程技术网

PHP OOP理论-类内或类外的错误检查?

PHP OOP理论-类内或类外的错误检查?,php,oop,Php,Oop,我正在过渡到在我所有的项目中使用OOP,从历史上看,我构建的所有东西都非常小,OOP似乎不是一个有效的选择,但现在在大型项目中它是。然而,最近我遇到了越来越多的“最佳实践”问题,我无法找到答案 例如,假设我有以下内容: class numbers{ function __construct($number){ $this->number = (int)$number; } function add($add){ $this->

我正在过渡到在我所有的项目中使用OOP,从历史上看,我构建的所有东西都非常小,OOP似乎不是一个有效的选择,但现在在大型项目中它是。然而,最近我遇到了越来越多的“最佳实践”问题,我无法找到答案

例如,假设我有以下内容:

class numbers{

    function __construct($number){
        $this->number = (int)$number;
    }

    function add($add){
        $this->added = $this->number + $add;
    }

    function multiply($multiply){
        $this->multiplied = $this->number * $multiply;
    }

    function minus($minus){
        $this->minused = $this->number - $minus;
    }

    function number(){
        return $this->number();
    }
}
现在让我们假设我想应用
,然后
,然后
。每个阶段都可能失败(我没有在示例中包括这一点,但想象一下它就在那里)。这就是我的问题所在,我应该:

$numbers = new numbers(8);
if($numbers->add(7)){
    if($numbers->multiply(6)){
        if($numbers->minus(7){
            echo $numbers->number();
        }else{
            echo 'error minusing';
        }   
    }else{
        echo 'error multiplying number';
    }   
}else{
    echo 'error adding number';
}
或者我应该在构造器中包含该部分,比如:

class numbers{

    function __construct($number){
        $this->add(6);
        $this->multiply(9);
        $this->minus(7);
        if($this->error){
            return false;
        }else{
            return true;
        }
    }

    function add($add){
        $this->added = $this->number + $add;
        if(!this->added){
            $this->error = "couldn't be added";
        }
    }

    function multiply($multiply){
        $this->multiplied = $this->number * $multiply;
        if(!this->multiplied){
            $this->error = "couldn't be multiplied";
        }
    }

    function minus($minus){
        $this->minused = $this->number - $minus;
        if(!this->minused){
            $this->error = "couldn't be minused";
        }
    }

    function number(){
        return $this->number();
    }

    function error(){
        return $this->error();
    }

}
然后简单地做:

$numbers = new numbers(5);
if($numbers){
    echo $numbers->number();
}else{
    echo $numbers->error();
}

很抱歉,如果这个例子冗长(也忽略错误,我在这里写它只是为了概述我正在尝试做什么,这不是我正在使用的代码…),但是我不知道如果没有一个例子,如何表达这个问题。基本上,我应该在类内部检查错误,还是在调用类时在外部检查错误

在类内部的更新上强制一致性几乎总是有意义的(即,任何时候一个方法可以改变类的内部状态,请检查输入)。然后,如果输入格式不正确,或者该操作将违反某些类不变量,则使用将其作为调用方的问题。

在类内部执行的错误检查应考虑该类的方法失败的可能性。换句话说,如果你的数字类有一个除法,它应该检查以确保分母不是零

对类实例(类外部)执行的错误检查应该是验证返回的属性或类方法的结果是否正确。由于设计良好的类通常不应该出现这种情况,所以您通常会检查极端情况


然而,当你开始有一个类来跟踪多个事情,比如你的案例时,我通常会进一步分离这个类。创建处理数学函数的类,然后让数字类使用这些数学类。通过这种方式,您可以更好地分离关注点、更整洁的代码和更容易的测试。

就我个人而言,我不想在第二个示例中尝试在构造函数中执行什么。它对实现进行硬编码,并违反了。否则,当您执行
$num=newnumber(8)时,不知道类在内部做什么,很难理解你为什么要拿回
47
。。。它也违反了不

至于方法,我觉得不错。在这些情况下,您可能希望抛出异常或返回布尔值。您选择的是一个比这里讨论的因素多得多的因素(例如您的偏好、类到底在做什么、惯例等等)

哦,你们班上有一些无限循环的问题<代码>函数编号()
应为:

function number() {
    return $this->number;
}

error()

@fructedWithFormsDesigner也一样:为什么要编辑?该方法称为“减号”——在这种情况下使用动词形式是完全可以接受的。我认为你的编辑使这个问题更加混乱,而不是更少。@Gian:当使用方法名称作为动词时,通常最好清楚地表明你所说的是方法,而不是一般的、更类似的动词。这句话:“我想
,然后
,然后
”清楚地表明,你说的是调用
方法,而不是试图将“减”这个词误用为动词。在英语国家,它被称为减法。减号是一个符号。@我同意,这是一个更好的编辑,我想@hopeseekr,这完全忽略了OP将方法命名为“减号”的事实,因此术语的一致性表明继续使用相同的术语(对或错)比依赖外部定义更有意义。方法名称也可以是“苹果”、“梨”和“香蕉”,然后句子会是“我想要苹果,然后是梨,然后是香蕉”。这是非标准用法,但在英语中肯定有优先权(而且,我也是母语人士)。+1来自我。比我(现在已删除)的回答更好地陈述了情况。我还没喝咖啡呢,那你就应该对我的答案投赞成票。虽然我做的很少,但我确实为每一件可能出错的事情添加了检查(除了像缺乏记忆这样的疯狂事情)。