web-dev-qa-db-ja.com

Void戻り型として

PHP 7。

PHP 7:の戻り値の型をテストする簡単なスクリプトを作成しました。

<?php

Class Obj {

    public function __construct(){

    }

    public function test(): string { //a string needs to be returned
        return "ok";
    }

}

function foo(): Obj { //instance of Obj needs to be returned
    return new Obj();
}

$o = foo();
echo $o->test(); // output: ok

他のプログラミング言語では、戻り型voidを指定すると、何も返せないか、エラーが発生します。そこで、このスクリプトを書きました。

<?php

    function foo(): void {

    }

    foo(); 

さて、上記のスクリプトでは、期待される出力は何もありません。代わりに、致命的なエラーが表示されます。

致命的エラー:foo()の戻り値はvoidのインスタンスである必要があり、2行目では何も返されません

私の質問は(見つけることができませんでした)、PHP 7で同様のvoidタイプがありますか?

40
Daan

編集:

void return type の新しい別個のRFCが公開され、投票に合格し、PHP 7.1。
PHPにはvoid戻り型があります。 :)

元の投稿:

wiki.php.net から取得:

今後の仕事

このRFCの範囲外の将来の作業のアイデアには、次のものがあります。

  • 関数が何も返さないことを宣言できるようにします(void in Java and C)

そのため、現在、何も返さないと宣言する方法はありません。
あなたの状況で何が最善かはわかりませんが、おそらく今のところは戻り値の型を宣言しないでください。

PHP 7にvoid戻り値の型があるかどうかあなたの質問に答えるには:
まだguaranteeはありませんが、voidまたは類義語が何ら​​かの方法で実装される可能性が非常に高いと思います。

56
Siguza

ここで戻り値型のRFCの著者。 PHP 7.0では、void戻り値の型はありません。なぜなら、 RFC は追加せず、他のRFCターゲティングもPHP 7.0。

タイプvoidは、PHP 7シリーズに存在する可能性があります。新しいキー/予約語を追加しても、コードが破損する場合でもマイナーリリースで問題ありません。 、しかし、それはPHP 5.4でcallableキーワードとともに行われました。


個人的には、void;は必要ないと思います。既にnullがあります。 マニュアルから

特別なNULL値は、値のない変数を表します。 NULLは、null型の唯一の可能な値です。

In PHP何も返さない関数は、暗黙的にnullを返します。これは、実際にはできないことを意味します何も返さない*。nullルートに行くことは、 nullが=で始まる有効なクラス/インターフェイス/特性名ではないため、下位互換性の中断がないことを意味します。 PHP 7. そして、新しいキーや予約語を追加しません。

* Zend Engineに精通している人は、何も返せないことを認識しますが、何も返さない場合、割り当てている変数にはnullが割り当てられ、論理的に同等になります。


PHP 7.1ではvoid疑似タイプがあります。これは Void Return Type RFC で定義されています。

個人的には、RFCの作成者が以前に「終了」し、RFCを取り上げていたため、これについては残念です。次に、それが提案され、議論されていることを私が知っているので、彼女は私が上記のように無効に対応するユニオンタイプを提案するのを待ちません。しかたがない。

17
Levi Morrison

voidreturn型は、PHP 7.1で受け入れられました。ですから、それは将来来るでしょう。

動作の例:

function should_return_nothing(): void {
    return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
    return null; // Fatal error: A void function must not return a value
}
function lacks_return(): void {
    // valid
}
function returns_nothing(): void {
    return; // valid
}

詳細については、 Andrea FauldsのRFC を参照してください!

14
acrobat

PHPにはvoidに相当する型はなく、NULLを返します。 0や他の値のような型を持たないため、要件に適合する場合があります。注:実際の無効は返品しないことを意味します。

1

@BeNice私はあなたの主張を理解しています、とにかく持続可能性の実用的な質問としてレヴィ・モリソンからの考察を要約します:voidを可能な戻り型の事実として導入すると、nullnullです。

この方法では、voidの型チェックのためにnullが返され、設計によってアーキテクチャの制約が変更され、下位互換性に混乱が生じます。

// your choice implies this comparison should be true:
gettype(null) === void;

自分のコードでnullを頻繁に使用しなかった人は、void型の実装に耐えると思います。

0