有没有办法将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)并且感觉不太优雅。
答案 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;
屏幕截图:
答案 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
}
}