2010-11-24 26 views
1

j'ai vu cette phrase dans le PHPUnit Documentation:« sauvegarde et de restauration pour des attributs de classe statique » en PHP

La mise en œuvre de la sauvegarde et les opérations de restauration pour statiques attributs des classes nécessite PHP 5.3 (ou plus). La mise en œuvre de la sauvegarde et de restauration pour variables globales et les attributs statiques des classes utilise serialize() et unserialize()

Quelle est l'idée derrière tout cela? Je veux dire, je n'ai pas utilisé sérialiser et désérialiser à cette fin. Comment exactement ces opérations dites de «sauvegarde et restauration» sont-elles liées aux attributs statiques?

+1

Pouvez-vous créer un lien vers la section du manuel? –

Répondre

3

L'idée est simplement de restaurer l'état initial connu entre les tests. Les propriétés statiques sont essentiellement les mêmes que les variables globales. Considérez

class TestSubject 
{ 
    public static $i = 0; 
    public function __construct() { self::$i++; } 
} 

Supposons maintenant que vous créer de nouvelles instances de TestSubject dans la méthode de configuration de votre test. Étant donné que les propriétés statiques sont partagées entre toutes les instances d'une classe, TestSubject::i augmentera chaque fois que vous créez une nouvelle instance. Il ne sera pas réinitialisé. Il maintient son état globalement. Ceci est indésirable avec les tests unitaires parce que pour écrire des tests fiables, vous avez besoin d'un état isolé, reproductible et connu. Ainsi, les membres protégés doivent être réinitialisés entre les cas de test, que vous pouvez activer dans PHPUnit avec l'annotation @backupStaticAttributes.

Exemple:

/** 
* @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); 
    } 
} 

Si vous supprimez l'annotation, le troisième test échouera.

+0

Cela a du sens. Avez-vous une idée de ce qui a changé dans PHP 5.3 pour changer le comportement? Je ne vois rien dans les docs sur 'serialize()' sur les propriétés statiques étant sérialisé maintenant –

+0

@Pekka nope désolé. Aucune idée. – Gordon

+0

Peut-être à cause de ['__callStatic'] (http://www.php.net/manual/fr/language.oop5.overloading.php#language.oop5.overloading.methods). –