2016-05-13 12 views
7

私は混合型のパラメータを取るPHP 7関数を定義したいと思います。 (私が望むのは、C#のジェネリック型パラメータに相当します;もしPHP 7でそれをエミュレートするより良い方法があれば教えてください)PHP 7:私自身の関数で混合パラメータ型を使用するには?

私のコードは以下の通りです。

<?php 
declare (strict_types = 1);  

function test (mixed $s) : mixed { 
    return $s; 
} 

// Works 
echo gettype ('hello'); 
// Does not work 
echo test ('hello'); 
?> 

このコードを実行すると、次のようになります。

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4 
Stack trace: 
#0 mixed.php(11): test('hello') 
#1 {main} 
thrown in mixed.php on line 4 

私はテスト()の呼び出しをコメントアウトした場合、コードは正常に動作しますので、私は、関数宣言で混合パラメータの型を使用するために明らかにそれは少なくとも大丈夫です。

gettype()などの組み込みのPHP関数は、混合パラメータを取ることができますが、厳密な型指定を内部的に使用しているかどうかはわかりません。

「混合」もPHP documentationの疑似型として使用されているので、「混合」をPHPキーワードとして誤解する可能性がありますが、少なくともここで私が見ているのは、正当なキーワードです。私はそれを意図していない方法で単に使用していますか?

最後に、パラメータタイプを指定しないだけですべてを回避することができましたが、すべてのパラメータと戻り値の型を指定して一貫性を持たせたいと思います。

ありがとうございました。追加情報を提供できるかどうかお知らせください。

+2

上に述べたようにも、このために働くはい、 'mixed'は実数型ではありません。一貫性を保つことは、ここでの適切なセマンティクスとは直交しています。 – mario

+2

FYI mixedはタイプではありません。 (http://php.net/manual/en/language.pseudo-types.php)**疑似型**:任意のTypeがMethodに渡される、またはMethodから返される可能性があるというヒント。おそらく何らかの理由で混在しているような型付けされた変数の場合... C#とは異なり、あなたが達成しようとしているのは、特にstrict_typesをtrueに設定した** PHPです。ただし、タイプヒントを指定しない限り、メソッドは任意のタイプを受け入れることができます。しかし、C#のプログラマーにとっては、まだ悪い** PHPのジュースです** – Poiz

+1

非常にマリオとポイズありがとうございます。私はちょうど/ *混合* /をコメントとして追加するために解決するように見えます。 – FSharpN00b

答えて

7

FYI 混合タイプではありません。 (Refer to the Documentation)。それだけで擬似タイプです:...または、おそらく何らかの理由で混合して緩やかに型付けされた変数のために... ヒント任意のタイプに渡されたかのメソッドから返される可能性があることを

C#とは異なり、PHPでは特にのstrict_typesがtrueに設定されていると、扱いにくいかもしれません。

しかし、厳密なタイプ指定なしでほぼ​​同じ効果を得ることができます。この場合、タイプヒントを指定しない限り、メソッドはどのタイプも受け入れることができます。 C#のプログラマにとっては、それは悪いですが、は、PHPのジュースです。

関連する問題