工厂设计模式中,如何让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它呢?

🙏🙏🙏🙏🙏

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 4
    $fruits = "Apple";
    /** @var XXXFactory $factory */
    $factory = factory::$fruits();
    echo $factory->money();
/** @var App\Lib\Fruits\FruitsFactory $factory*/
$factory = app("App\Lib\Fruits\FruitsFactory");
echo factory::Apple()->money();

结论:
动态获取的都不行。


一个app方法,整个项目大量调用,每个app()调用后的方法返回值都不一样。怎么可能都识别到。那就不是IDE了,那该上AI了。

注释不仅是为了IDE用的,也是团队协作过程中方便团队其他人阅读和理解代码的(即便你是自己开发)

1年前 评论

在项目根目录下放一个 .phpstorm.meta.php 文件,内容如下,必须要在 PHPSTORM_META 命名空间下。

详见:PhpStorm advanced metadata | PhpStorm

<?php

// see https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata
namespace PHPSTORM_META {

    override(app(0), map([
        '' => '@',
        'aliyun'=>\Strategy\Aliyun::class,
        'aws'=>\Strategy\AWS::class,
    ]));

}
1年前 评论

关于如何使用服务提供者

如果你提供的服务只需一个单例,可以在服务提供者中绑定单例。

如果你提供的服务无需每次加载,可以在服务提供者中延迟加载。

laravel 中的 MailServiceProvider 举个栗子:chestnut:

file

1年前 评论
陈先生
$namespace = 'App\Lib\Fruits\\';

return app($namespace . $className);

问题主要可以在这一块解决 只需要加一个抽象类,这里注释加一下 抽象类的 注解

file

你拼接出来的类 必须要继承你水果的基础抽象类,方法统一封装抽象.这样 phpstorm 就可以帮你了.

VScode 没用过.不清楚.

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!