如何在PHPDoc中弃用PHP的魔术属性?

时间:2016-05-31 19:41:19

标签: php phpdoc

有没有办法将magic property标记为已弃用?请考虑以下简化代码:

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

现在,如何指出其他开发人员,他们不应再使用Example::$foo了?我想到的唯一可行解决方案是:

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

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

但是这两个都破坏了我的代码(没有调用getter)并且感觉不太优雅。

4 个答案:

答案 0 :(得分:7)

PHPDoc无法做到这一点,因为class MonadIO m where liftIO :: IO a -> m a instance MonadIO IO where liftIO m = m instance MonadIO m => MonadIO (MaybeT m) where liftIO m = lift (liftIO m) 只能与结构元素(documentation)相关联。

如果开发人员知道他们不再使用此魔术属性非常重要,则可能会触发 41 # The filename Kbuild has precedence over Makefile 42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 44 include $(kbuild-file) 错误:

@deprecated

答案 1 :(得分:3)

@mixin方法至少适用于PhpStorm:

/**
 * class or trait for the {@mixin} annotation
 */
trait DeprecatedExampleTrait {

    /**
     * Declare it as private to increase the warning level
     * @deprecated
     * @var string
     */
    public $foo;
}

/**
 * Example class
 *
 * @mixin DeprecatedExampleTrait
 *
 * @property string $newFoo A foo variable.
 */
class Example {
    /**
     * Magic getter
     */
    public function __get($var) {
        if (in_array($var, ['foo', 'newFoo'])) {
            // do & return something
        }
    }
}

$example = new Example;
$example->foo;

屏幕截图:

PhpStorm Screenshot

答案 2 :(得分:1)

为防止用户使用您不赞成使用的属性,您只需从类标题中删除该属性的PHPDoc。

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

这样,您将保持原有代码正常工作,而该属性将不再由IDE自动完成工具等显示。

答案 3 :(得分:-1)

我认为您最好的选择是明确定义$foo属性,以便您可以使用@deprecated对其进行记录。为了保持当前使用// do & return something产生的$myExample->foo行为,您可以在构造函数中为$this->foo分配匿名函数。因此,该逻辑不再存在于__get()中,一旦$foo被明确定义,它就会从执行路径中消失。

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