如何通过PhpDoc注解实现类名仅在一处声明,避免重复修改?
最优解决方案:使用::class类名常量
PHP 5.5及以上版本支持::class语法,是最符合需求的实现方式,修改后的代码如下:
// 如果AdaptedClass有命名空间,先通过use引入,没有则可省略该行 use App\Namespace\AdaptedClass; class SomeClass { /** @var AdaptedClass */ private $adaptor; public function __construct() { $adaptorClassName = AdaptedClass::class; if (class_exists($adaptorClassName)) { $this->adaptor = new $adaptorClassName(); } } }
该方案的优势:
::class会自动返回对应类的完整限定名字符串,哪怕对应类暂时不存在,也只会返回字符串不会触发报错,完全兼容原有class_exists的判断逻辑- PhpDoc注解中的类名和代码中
AdaptedClass::class指向同一个类引用,使用IDE的类重命名功能时,两处会同步更新,只需修改一次即可完成全量替换 - 可以避免手动写字符串类名的拼写错误,同时支持IDE的类型提示、自动补全能力
低版本PHP兼容方案(PHP 5.4及以下)
如果需要兼容不支持::class的老版本PHP,可以通过类常量统一管理类名:
class SomeClass { const ADAPTED_CLASS = 'AdaptedClass'; /** @var AdaptedClass */ private $adaptor; public function __construct() { $adaptorClassName = self::ADAPTED_CLASS; if (class_exists($adaptorClassName)) { $this->adaptor = new $adaptorClassName(); } } }
修改类名时只需调整类常量的赋值和PhpDoc注解两处,相比原方案也降低了修改遗漏的概率,同时支持IDE对常量的全局搜索替换。
内容的提问来源于stack exchange,提问作者Roman K.
相关产品推荐
相关产品推荐

