工厂设计模式中,如何让phpStorm认识调用的是哪个指定的方法?
工厂类代码demo
Apple(苹果类)
namespace App\Lib\Fruits;
class Apple{
public function money(){
return 2;
}
}
Banana(香蕉类)
namespace App\Lib\Fruits;
class Banana{
public function money(){
return 0.5;
}
}
FruitsFactory (水果工厂)
namespace App\Lib\Fruits;
/**
*
* @method static \App\Lib\Fruits\Apple Apple()
/
class FruitsFactory{
//调用指定的第三方类
public static function make($className)
{
$namespace = 'App\Lib\Fruits\\';
return app($namespace . $className);
}
public static function __callStatic($name, $arguments)
{
return self::make($name, ...$arguments);
}
}
调用Test类
class Test(FruitsFactory $factory){
//情况一
$fruits = "Apple";
//编辑器找不到money()
echo factory::$fruits()->money();
//编辑器找得到money()
echo factory::Apple()->money();
//情况二
$factory = new ThirdCustomFactory();
//找得到
echo factory::Apple()->money();
//情况三
$factory = app("App\Lib\Fruits\FruitsFactory");
//找不到
echo factory::Apple()->money();
}
问题
想知道上述调用到的Test类中如何让编辑器识别到
factory::$fruits()->money();
即便是下述写法,也需要在factory里面加入@method
factory::Apple()->money();
有没有什么办法可以在连@method都不需要写。。只需要去关心生成的对应的水果类,和具体调用的地方.
另外-关于如何使用服务提供者
这三种情况都可以正常的返回出我想要的结果,但是在情况三中,在make之前我没有进行指定register,但是也能make通,所以在laravel中,什么情况或者功能下,我才需要用到ServiceProvider,去register它呢?
🙏🙏🙏🙏🙏
结论:
动态获取的都不行。
一个app方法,整个项目大量调用,每个app()调用后的方法返回值都不一样。怎么可能都识别到。那就不是IDE了,那该上AI了。
注释不仅是为了IDE用的,也是团队协作过程中方便团队其他人阅读和理解代码的(即便你是自己开发)
在项目根目录下放一个
.phpstorm.meta.php
文件,内容如下,必须要在PHPSTORM_META
命名空间下。详见:PhpStorm advanced metadata | PhpStorm
如果你提供的服务只需一个单例,可以在服务提供者中绑定单例。
如果你提供的服务无需每次加载,可以在服务提供者中延迟加载。
拿
laravel
中的MailServiceProvider
举个栗子:chestnut:问题主要可以在这一块解决 只需要加一个抽象类,这里注释加一下 抽象类的 注解
你拼接出来的类 必须要继承你水果的基础抽象类,方法统一封装抽象.这样
phpstorm
就可以帮你了.VScode 没用过.不清楚.