2016-05-31 20 views
10

C'è un modo per contrassegnare uno magic property come deprecato? Considerate seguente, il codice semplificato:Come deprecare la proprietà magica di PHP in PHPDoc?

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

Ora, come per indicare altri sviluppatori, che non dovrebbero più usare Example::$foo? L'unica soluzione di lavoro che mi viene in mente è:

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

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

Ma questa sia spezza il codice (getter non è chiamato) e non si sente molto elegante.

+0

lanciare un avviso o un'eccezione e documentarlo? –

+0

[Mi sembra legittimo] (https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.deprecated.pkg.html) - non viene compilato? –

+0

@self Non voglio rompere le vecchie dipendenze - solo indicare che non dovrebbe essere usato nel codice più recente. – pamelus

risposta

7

Questo non è possibile con PHPDoc poiché lo @deprecated può essere associato solo a elementi strutturali (documentation).

Se è veramente importante per gli sviluppatori di sapere che essi non dovrebbero più utilizzare questa proprietà magica, si potrebbe attivare un errore E_USER_DEPRECATED:

/** 
* 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

Una proprietà [è un elemento strutturale] (https://phpdoc.org/docs/latest/glossary.html#term-structural-elements). –

+1

Sì, ma la domanda qui è se è possibile associare un '@ deprecato' con una' proprietà @, che non è possibile in quanto è possibile associare solo '@ deprecated' con * real * properties/classes/interfaces/methods – Pieter

+0

Sì , il tuo esempio non corrisponde però alla domanda.Nella domanda, è una proprietà * reale * –

0

penso che la soluzione migliore sarebbe di definire esplicitamente il $foo proprietà, in modo da poterlo documentare con @deprecated. Per mantenere il comportamento di // do & return something che attualmente risulta dall'utilizzo di $myExample->foo, è possibile assegnare una funzione anonima a $this->foo nel costruttore. Pertanto, tale logica non risiede più in __get(), che è caduto fuori dal percorso di esecuzione non appena $foo è stato definito in modo esplicito.

/** 
* 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

Assegnare una funzione anonima a $ this-> foo' non farà in modo che questa funzione agisca come getter. L'accesso a 'pippo' restituirà solo la funzione e non il valore di ritorno della funzione. –