2016-05-31 3 views
10

magic propertyを非推奨とする方法はありますか?彼らはもうExample::$fooを使用してはならないこと、PHPDocでPHPの魔法のプロパティを非難する方法は?

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

は今、どのように他の開発者を示すために、次の、簡略化されたコードを考えてみましょうか?

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

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

しかし、これは私のコードを壊す(ゲッターが呼び出されていない)と非常に上品な感じがしない、両方:私の心に来るだけの作業ソリューションです。

+0

警告または例外をスローし、それを文書化しますか? –

+0

[私には正当に見える](https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.deprecated.pkg.html) - コンパイルされませんか? –

+0

@self古い依存関係を壊すことは望んでいません。新しいコードでは使用しないでください。 – pamelus

答えて

7

@deprecatedは構造要素(documentation)としか関連付けられていないため、これはPHPDocでは不可能です。

開発者が、彼らはもはや、この魔法のプロパティを使用するべきではないことを知っているために、あなたは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

プロパティは[構造要素です](https://phpdoc.org/docs/latest/glossary.html#term-structural-elements)。 –

+1

はい、ここでの質問は '@ deprecated'と' @ property'を関連付けることができます。これは '@ deprecated'を* real * properties/classes/interfaces/methodsに関連付けることができないので不可能です。 – Pieter

+0

ええしかし、あなたの例は質問にマッチしません。質問では、それは* real *のプロパティです –

0

を私はここにあなたの最善の策は、明示的$fooを定義することだと思いますあなたは@deprecatedでそれを文書化することができます。 $myExample->fooを現在使用している動作を// do & return somethingの状態に保つために、コンストラクタの$this->fooに無名関数を割り当てることができます。したがって、そのロジックは、$fooが明示的に定義されるとすぐに実行パスから外れた__get()に存在しなくなりました。

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

'$ this-> foo'に無名関数を代入しても、この関数はゲッターとして動作しません。 'foo'にアクセスすると関数の戻り値だけが返されます。 –

関連する問題