gpt4 book ai didi

php - 在 PHP 中模拟泛型类

转载 作者:可可西里 更新时间:2023-10-31 23:00:40 27 4
gpt4 key购买 nike

我正在尝试实现一个处理查询的结果类。所以,简单地说,您将拥有这样的功能:

function all();
function first();
function paginate(int $perPage, int $pageNo = 1);

这工作得很好,问题是当在多个不同的查询类中使用相同的结果类时,IDE 无法知道返回类型。示例:

UserQuery->results()->all()将返回一组用户实体。

UserQuery->results()->first()将返回单个用户实体。

在某些语言中,你有泛型,这意味着我可以只使用 Results<User>在 UserQuery 类中,然后我的结果类可以返回 T[]T分别。

我的一个想法是将一个空实体作为构造函数传递给 Results 类,然后尝试将该属性用作返回类型,但我无法弄清楚这一点。有什么解决方法吗?我试图解决的主要问题是 IDE 自动完成和分析,因此纯 phpDoc 解决方案非常适合我的用例。

我能想出的唯一其他解决方法是必须为每个实体类型编写一个单独的 Results 类,这将被证明是令人筋疲力尽的。

最佳答案

我认为没有办法完全按照您的描述进行操作,但在类似情况下,我建议为每个结果类型使用代理类,并使用 phpDocumentor 的 @method 记录正确的返回类型。 .该解决方案的附加值是为任何特定类型的结果修改和扩展提供了一个很好的位置。这是一个例子:

abstract class Results
{
function all(): array
{
}

function first()
{
}

function paginate(int $perPage, int $pageNo = 1): array
{
}
}

class User { }

/**
* @method User[] all()
* @method User first()
* @method User[] paginate(int $perPage, int $pageNo = 1)
*/
class UserResults extends Results { }

class UserQuery
{
/**
* @var UserResults
*/
private $results;

public function __construct()
{
$this->results = new UserResults();
}

public function results(): UserResults
{
return $this->results;
}
}

$userQuery = new UserQuery();
$test = $userQuery->results()->all();

PhpStorm correctly recognises returned type

关于php - 在 PHP 中模拟泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com