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,在一个类中,方法相互依赖是可以的,方法封装在一起?这会影响单元测试吗?或者术语Unit是指整个类,而不是类自己的方法 可以这样做: <?php class foo { protected $baz; protected $bar; private function checkBaz($baz) { // do some checking } private function checkBar($bar) { //

在一个类中,方法相互依赖是可以的,方法封装在一起?这会影响单元测试吗?或者术语
Unit
是指整个类,而不是类自己的方法

可以这样做:

<?php

class foo {
    protected $baz;
    protected $bar;

    private function checkBaz($baz) {
        // do some checking
    }
    private function checkBar($bar) {
        // do some checking
    }
    public function setBaz($baz) {
        if($this->checkBaz($baz)){
            $this->baz = $baz;
        }
    }
    public function setBar($bar) {
        if($this->checkBar($bar)){
            $this->bar = $bar;
        }
    }
}
interface IFoo
{
    public function setBaz($baz)
    public function setBar($bar)
}

是的,在类中内部调用方法是绝对正确的。事实上,这是受到鼓励的。仅仅存在
受保护的
私有
方法就应该是一种致命的赠品。您只能从类内调用这些函数,从需要由
public
方法触发的某个地方调用,因此,如果您的示例与这些方法的使用方式完全一致,那么是的


在一般情况下,就单元测试而言,唯一重要的事情是对象作为一个整体的行为。它的
public
组件很重要,这是其他代码与之交互的内容,也是其他代码观察到的内容。您的对象/类所做的任何类型的内部调用都完全取决于它自己的判断。如果将某些代码放在单独的方法中并对外部世界隐藏有助于您的类结构,那么就这样吧。

非公共方法没有错。事实上,一个类应该只导出最少的公共方法,以允许其他类使用它的服务。外部类越了解类的内部工作方式,就越难在不破坏外部依赖关系的情况下更改类的内部工作方式

应该通过间接调用来测试非公共方法。应该存在这样一种情况,即每个方法最终都会被调用,即使是通过间接调用(公共方法调用私有方法,等等)。如果一个方法从未在单元测试中执行过,那么这就很好地表明它实际上是死代码,可以从类中完全删除


理论上,您可以通过对类进行子类化并将受保护的方法提升为public来直接测试类的受保护方法,但不建议这样做,因为它公开了类的内部工作,而您实际上并不想这样做

是的,像这样执行方法调用非常好。它们被标记为
private
,因此它们仍然封装在类中,不对外公开

如果这些方法调用开始导致类/对象偏离其主要目的,即中断,那么值得考虑将类拆分为更精细的单元,并通过注入这种新的依赖关系。例如,如果
checkBaz
方法正在执行数据库查找

就单元测试而言,您真正想要做的是为您的foo类创建一个接口并实现它。这意味着,无论何时对其编程,您都是在按照契约进行编程,从而可以轻松地模拟
IFoo
实现

例如:

您的界面将如下所示:

<?php

class foo {
    protected $baz;
    protected $bar;

    private function checkBaz($baz) {
        // do some checking
    }
    private function checkBar($bar) {
        // do some checking
    }
    public function setBaz($baz) {
        if($this->checkBaz($baz)){
            $this->baz = $baz;
        }
    }
    public function setBar($bar) {
        if($this->checkBar($bar)){
            $this->bar = $bar;
        }
    }
}
interface IFoo
{
    public function setBaz($baz)
    public function setBar($bar)
}

我还建议您遵循以下步骤,并使您的类名先大写。如果这是您或您的团队做出的决定,那么这完全是您的决定。

您要测试的是您的类的公共(或接口)。(顺便说一句,方法名称中的uu不符合PSR标准)。只要你能模仿你的依赖关系,你就不会有问题。您测试您的公共方法是否有效,而不关心它们如何工作。@任何人PSR都不是标准。它没有得到PHP小组的批准。他们只是一群有意见的人。@任何人都删除了方法名称前面的
\uu
。并不是我所有的代码都是按照do PSR标准编写的,这是我目前所做的。@GordonM我不是说这是必须的。然而,这是唯一的标准,作曲家和Symfony2都正确地定义和遵循了这一标准。因此,即使您不喜欢代码样式,我也建议您遵循它(我不同意某些事情,但标准就是标准)。如果每个人都能遵循它,生活就会轻松得多:P@Anyone这是我的观点,这不是一个标准。充其量只是一个建议。