ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在PHP中模拟通用类

2019-10-24 18:31:04  阅读:233  来源: 互联网

标签:generics phpdoc php


我正在尝试实现处理查询的Results类.简而言之,您将具有以下功能:

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

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

UserQuery-> results()-> all()将返回一个User实体数组.

UserQuery-> results()-> first()将返回单个User实体.

在某些语言中,您具有泛型,这意味着我可以只使用Results< User>在UserQuery类中,然后我的Results类可以分别返回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

标签:generics,phpdoc,php
来源: https://codeday.me/bug/20191024/1922732.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有