亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 PHP7 中,為什么子類的方法可以定義返回類型,而重寫的父方法卻沒有?

在 PHP7 中,為什么子類的方法可以定義返回類型,而重寫的父方法卻沒有?

PHP
四季花海 2023-04-02 11:13:57
考慮以下代碼片段:class Foo{    public function fooMethod()    {        return [];    }}class Bar extends Foo{    public function fooMethod(): array    {        return ['something'];    }}這工作沒有任何錯誤(在 PHP7.4 和 PHP7.3 中測試)。為什么 PHP 不強制子進程的方法簽名與父進程相同(即沒有返回類型)?PHP 允許這樣做是否有正當理由,或者這是一個錯誤?我的猜測是,通過不在父級中聲明它,我們實際上是在說它可以返回“混合”,因此任何返回類型都是有效的,但我很想知道原因。
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

PHP手冊指出:

筆記:

覆蓋父方法時,子方法必須匹配父方法的任何返回類型聲明。如果父方法沒有定義返回類型,那么子方法可能會這樣做。

請注意以下行:“如果父方法未定義返回類型,則子方法可能會這樣做”

所以如果你看看你的例子;Foo 類中的父方法沒有定義返回類型,因此 Bar 類中的子方法可以設置它希望的任何返回類型。

A:

class Foo

{

? ? public function fooMethod()

? ? {

? ? ? ? return []; // returns an array. Type expected: any.

? ? }

}


class Bar extends Foo

{

? ? public function fooMethod(): array

? ? {

? ? ? ? return ['something']; // returns an array, type expected: array

? ? }

}

乙:

這個很好用,因為沒有預先存在的類型期望,所以當子類設置一個類型時,它不會覆蓋任何東西。


class Foo

{

? ? public function fooMethod()

? ? {

? ? ? ? return []; // returns an array, type expected any

? ? }

}


class Bar extends Foo

{

? ? public function fooMethod(): string

? ? {

? ? ? ? return "horses"; // returns a string, type expected: string

? ? }

}

C:

這會導致問題(即你邪惡的軍事月球基地將隨著失去所有的手而被摧毀)因為孩子試圖覆蓋父方法的已經定義的返回類型屬性。


class Foo

{

? ? public function fooMethod(): int

? ? {

? ? ? ? return 874; // returns an int, type expected is int.

? ? }

}


class Bar extends Foo

{

? ? public function fooMethod(): array

? ? {

? ? ? ? return ['something']; // returns an array, type expected int

? ? }

}


查看完整回答
反對 回復 2023-04-02
  • 1 回答
  • 0 關注
  • 119 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號