如何在PHP中访问私有属性?

时间:2012-07-01 18:44:43

标签: php unit-testing reflection phpunit

  

可能重复:
  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后,我正在为禁用功能编写单元测试时,我想断言它是否为假。

但我如何访问$_isEnabled

这是我的测试功能:

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

3 个答案:

答案 0 :(得分:2)

简短回答:

你做不到。这就是私人的意思......

答案很长:

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

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

虽然它有点复杂,并且增加了另一层容易出现故障,因此它不是测试的最佳方式......

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

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

但如果你没有那么简单,我认为你不想创造它......但考虑到替代方案,你可以重新考虑它。

答案 1 :(得分:1)

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

这是使用魔术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

答案 2 :(得分:1)

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

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

一般来说,依靠实施进行单元测试是不好的事情;然后重新实现也可以保持单元测试。