我有一些方法可以返回one of two return types.我使用的是一个利用MCV的框架,所以重构这几个函数并没有什么吸引力.

是否可以声明返回一个或另一个的返回类型,并在其他任何方面失败?

function test(): ?
{
    if ($this->condition === false) {
        return FailObject;
    }

    return SucceedObject;
}

推荐答案

从PHP 8+开始,您可以使用union types:

function test(): FailObject|SuccessObject {}

另一种方式是两个对象共享一个接口,这种方式自PHP4以来的所有版本都可以使用.例子:

interface ReturnInterface {}
class FailObject implements ReturnInterface {}
class SuccessObject implements ReturnInterface {}
function test(): ReturnInterface {}

在本例中,ReturnInterface为空.仅它的存在就支持所需的返回类型声明.

还可以使用基类,可能是抽象类.


对我来说,对于这个用例,接口比联合类型更清晰、更可扩展.例如,如果我以后想要WarnObject,我只需要将其定义为扩展ReturnInterface,而不是遍历所有签名并将其更新为FailObject|SuccessObject|WarnObject.

Php相关问答推荐

PHP-转义字符串内的双反斜杠

如何更改数据表行背景 colored颜色

创建一个新的可变产品及其属性以用于WooCommerce中的变体

按与WooCommerce管理顺序列表中的特定字符串不匹配的特定元值筛选订单

通过访问单个产品页面更新WooCommerce产品元数据

筛选器具有多个查询之一

HTAccess重写一些URL,但将所有其他URL发送到另一个页面

使用CODIGNITER3中的OR和AND子句进行查询

如何在laravel中添加延迟?

curl_close()未从PHP 8开始写入CURLOPT_COOKIEJAR会话文件

除WooCommerce中的特定国家/地区外,有条件地要求填写邮政编码 checkout 字段

Google Drive API 服务->文件->get('root') 失败并显示找不到文件. (范围问题?)

为什么 php 只能在我的 Nginx Web 服务器的某些目录中工作?

为什么 debug_backtrace() 不返回任何内容?

在 Botiga 主题模板中添加复选框到政策行.Woocommerce

如何在PHP中对多个脚本调用进行排队?

Docker: unixodbc.h 没有这样的文件或目录.已安装 unixodbc-dev 时出现pecl install sqlsrv错误

我正在使用 Baryryvdh/laravel-snappy 从 HTML 导出 PDF 它正在工作但缩小了 pdf 文件

getenv() 有时在 CodeIgniter 4 中返回 false.为什么?

PHP 从 API 获取随机项目