2016-05-31 6 views
10

Gibt es eine Möglichkeit, eine magic property als veraltet zu markieren? Betrachten wir folgende, vereinfachte Code:Wie verwerfen PHP magische Eigenschaft in PHPDoc?

/** 
* Example class 
* 
* @property string $foo A foo variable. 
*/ 
class Example { 
    /** 
    * Magic getter 
    */ 
    public function __get($var) { 
     if('foo' === $var) { 
      // do & return something 
     } 
    } 
} 

Nun, wie andere Entwickler, um anzuzeigen, dass sie nicht Example::$foo mehr verwenden sollte? Die einzige funktionierende Lösung, die mir in den Sinn kommt, ist:

/** 
* Example class 
*/ 
class Example { 
    /** 
    * A foo variable. 
    * 
    * @var string 
    * @deprecated 
    */ 
    public $foo; 

    /** 
    * Magic getter 
    */ 
    public function __get($var) { 
     if('foo' === $var) { 
      // do & return something 
     } 
    } 
} 

Aber diese beiden bricht mein Code (Getter nicht genannt) und fühlt sich nicht sehr elegant.

+0

eine Warnung oder eine Ausnahme auslösen und es dokumentieren? –

+0

[Scheint mir echt] (https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.deprecated.pkg.html) - kompiliert nicht? –

+0

@self Ich möchte alte Abhängigkeiten nicht trennen - nur angeben, dass sie nicht in neueren Code verwendet werden sollten. – pamelus

Antwort

7

Dies ist mit PHPDoc nicht möglich, da der @deprecated nur mit Strukturelementen (documentation) verknüpft werden kann.

Wenn es wirklich wichtig ist für die Entwickler zu wissen, dass sie nicht mehr diese magische Eigenschaft verwenden sollten, könnten Sie einen E_USER_DEPRECATED Fehler auslösen:

/** 
* Example class 
* 
* @property string $foo A foo variable. 
*/ 
class Example { 

    public function __get($name) 
    { 
     if ($name === 'foo') { 
      trigger_error('Property $foo is deprecated and should no longer be used', E_USER_DEPRECATED); 
     } 
     // ... 
    } 
} 
+0

Eine Eigenschaft [ist ein strukturelles Element] (https://phpdoc.org/docs/latest/glossary.html#term-strukturelle-elemente). –

+1

Ja, aber die Frage ist hier, ob Sie eine '@ deprecated' mit einer' @ property' verbinden können, was nicht möglich ist, da Sie '@ deprecated' nur mit * real * properties/classes/interfaces/methods verbinden können – Pieter

+0

Ja , Ihr Beispiel stimmt jedoch nicht mit der Frage überein.In der Frage handelt es sich um eine * real * Eigenschaft –

0

Ich denke, Sie hier die beste Wahl ausdrücklich sein würde, die $foo definieren Eigenschaft, so dass Sie es mit @deprecated dokumentieren können. Um das // do & return something-Verhalten beizubehalten, das derzeit aus der Verwendung von $myExample->foo resultiert, können Sie im Konstruktor $this->foo eine anonyme Funktion zuweisen. Daher lebt diese Logik nicht länger in __get(), die aus dem Ausführungspfad fiel, sobald $foo explizit definiert wurde.

/** 
* Example class 
*/ 
class Example { 

    /** 
    * A foo variable. 
    * 
    * @var string 
    * @deprecated 
    */ 
    public $foo; 

    /** 
    * constructor 
    */ 
    public function __construct() { 
     $this->foo = function() { 
      // do & return something 
     }; 
    } 

    /** 
    * Magic getter 
    */ 
    public function __get($var) { 
     // no longer handles calls to $this->foo 
    } 
} 
+0

Das Zuweisen einer anonymen Funktion zu $ ​​this-> foo' führt nicht dazu, dass diese Funktion als Getter fungiert. Der Zugriff auf 'foo' gibt nur die Funktion und nicht den Rückgabewert der Funktion zurück. –

Verwandte Themen