在我们写代码时,为了防止一个类被重复实例化,往往采用 单例模式 实例化类。
通常的做法是先写好一个基类 BaseLogic.class.php,内容如下:文章源自编程技术分享-https://mervyn.life/336543fc.html
<?php
namespace Logic;
class BaseLogic {
private static $instance = [];
public static function getInstance() {
$class_name = get_called_class();
if (isset(self::$instance[$class_name])) {
return self::$instance[$class_name];
}
self::$instance[$class_name] = new static();
return self::$instance[$class_name];
}
}
实际写业务逻辑时需要继承上边的 BaseLogic
, 代码如下:文章源自编程技术分享-https://mervyn.life/336543fc.html
<?php
namespace Logic;
class OrderLogic extends BaseLogic {
public function getOrderInfo() {
echo "order info";
}
}
实际使用该 OrderLogic
时,使用以下方法即可:文章源自编程技术分享-https://mervyn.life/336543fc.html
OrderLogic::getInstance()->getOrderInfo();
当用这种方式写代码时, PHPStorm 无法识别 getOrderInfo
方法, 针对这种情况只需要在函数上方加入注释 @return static
即可, 修改后的代码如下:文章源自编程技术分享-https://mervyn.life/336543fc.html
<?php
namespace Logic;
class BaseLogic {
private static $instance = [];
/**
* @return static
*/
public static function getInstance() {
$class_name = get_called_class();
if (isset(self::$instance[$class_name])) {
return self::$instance[$class_name];
}
self::$instance[$class_name] = new static();
return self::$instance[$class_name];
}
public function getOrderInfo() {
echo "get Order Info";
}
}
class OrderLogic extends BaseLogic {
public function getOrderInfo() {
echo "order info";
}
}
OrderLogic::getInstance()->getOrderInfo();
这时如果 BaseLogic
的 getInstance
方法的注释是 @return self
则跳转时只能跳到 BaseLogic
类对应的方法而无法跳到子类中。文章源自编程技术分享-https://mervyn.life/336543fc.html
这里主要跟 PHP 的后期延伸绑定有关。文章源自编程技术分享-https://mervyn.life/336543fc.html
参考链接:文章源自编程技术分享-https://mervyn.life/336543fc.html
后期静态绑定文章源自编程技术分享-https://mervyn.life/336543fc.html
评论