我看到這句話在備份的PHPUnit Documentation:「爲靜態類的備份和恢復操作屬性」,在PHP
實施和 還原類的靜態 屬性操作需要PHP 5.3 (或更高版本)。的 執行備份和恢復操作 全局變量和靜態屬性的類 使用序列化()和 反序列化()
這背後有什麼想法?我的意思是,我沒有爲此使用序列化和反序列化。這些所謂的「備份和恢復」操作究竟與靜態屬性有關?
我看到這句話在備份的PHPUnit Documentation:「爲靜態類的備份和恢復操作屬性」,在PHP
實施和 還原類的靜態 屬性操作需要PHP 5.3 (或更高版本)。的 執行備份和恢復操作 全局變量和靜態屬性的類 使用序列化()和 反序列化()
這背後有什麼想法?我的意思是,我沒有爲此使用序列化和反序列化。這些所謂的「備份和恢復」操作究竟與靜態屬性有關?
這個想法只是爲了恢復測試之間的初始已知狀態。靜態屬性與全局變量基本相同。考慮
class TestSubject
{
public static $i = 0;
public function __construct() { self::$i++; }
}
現在假設你在測試的設置方法創建的TestSubject
新實例。因爲靜態屬性在類的所有實例之間共享,所以TestSubject::i
將在每次創建新實例時增加。它不會被重置。它在全球範圍內維護其狀態。這對於單元測試是不希望的,因爲爲了編寫可靠的測試,您需要一個獨立的,可再現的和已知的狀態。因此,受保護的成員必須在測試用例之間重置,您可以在PHPUnit中使用@backupStaticAttributes
註釋啓用它們。
例子:
/**
* @backupStaticAttributes enabled
*/
class Test extends PHPUnit_Framework_TestCase
{
public function testInitialValueOfStaticMemberIsZero()
{
$this->assertSame(0, TestSubject::$i);
}
/**
* @depends testInitialValueOfStaticMemberIsZero
*/
public function testCreatingInstancesIncreasesStaticMember()
{
new TestSubject();
new TestSubject();
new TestSubject();
$this->assertSame(3, TestSubject::$i);
}
/**
* @depends testCreatingInstancesIncreasesStaticMember
*/
public function testStaticMembersAreResetBetweenTests()
{
$this->assertSame(0, TestSubject::$i);
}
}
如果刪除註釋,第三次測試將失敗。
有道理。你有什麼想法在PHP 5.3中改變了行爲?我沒有看到關於`serialize()`的文檔中有關正在被序列化的靜態屬性的任何內容 – 2010-11-24 08:28:01
你能鏈接到手冊部分嗎? – 2010-11-24 08:11:32