【问题标题】:How do I access private attributes in PHP? [duplicate]如何访问 PHP 中的私有属性? [复制]
【发布时间】:2012-07-02 08:09:27
【问题描述】:

可能重复:
Best practices to test protected methods with PHPUnit

class Footer
{
  private $_isEnabled;

  public function __construct(){
    $this->_isEnabled = true;
  }

  public function disable(){
    $this->_isEnabled = false;
  }  
}

当我在将_isEanabled 设置为false 后为禁用函数编写单元测试时,我想断言它是否为false。

但是我怎样才能访问$_isEnabled

这是我的测试功能:

public function testDisable(){
  $footer = new Footer();
  $footer->disable();
  $this->assertFalse($footer->_isEnable);
}

【问题讨论】:

  • 我认为这个问题应该重新打开,在接受的答案的 cmets 中有一个链接,描述了如何通过反射来做到这一点,它可以变成一个真正的答案,而且重复的问题也不要'似乎不再存在了

标签: php unit-testing reflection phpunit


【解决方案1】:

简答:

你不能。这就是 PRIVATE 的意思...

长答案:

您可以使用反射来做到这一点:

http://php.net/manual/en/book.reflection.php

不过,这有点复杂,并且添加了另一个容易失败的层,因此它不是测试的最佳方式...

我更喜欢创建一个 getter 函数:

public function getEnabled() {
   return $this->_isEnabled;
}

但如果你还没有做到这么简单,我认为你不想创建它……但考虑到其他选择,你可能会重新考虑它。

【讨论】:

【解决方案2】:

一个可访问的属性必须是公开的,我认为这是不言自明的。但是,您可能会遇到一些代码,其中受保护和私有属性似乎可以通过类似于访问公共变量的方式访问。

这是使用魔术 getter 方法完成的:

class Footer
{
    private $_isEnabled;

    public function __get($propName)
    {
        if (!isset($this->{$propName}))
        {
            throw new Exception($propName.' is not set');
        }
        return $this->{$propName};
    }
}

每次您尝试访问不存在或不公开的属性时都会调用此魔术方法。简而言之:

$instance->_isEnabled;//will work.

您可以随意更改此方法,例如,不再需要下划线...您可以用它做很多事情。
请参阅man pages

【讨论】:

    【解决方案3】:

    我怀疑由此获得积分:该课程不是“代数”完整的。缺少public function isEnabled()。如果单元测试没有关于状态的信息,那么其他类客户端也会错过这个信息。

    对私有内容的单元测试无助于在公共 API 上说明任何内容,而是检查应该显而易见的内部操作。

    一般来说,依赖于实现的单元测试是不好的业务;然后重新实现也可以维护单元测试。

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2015-03-22
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多