web-dev-qa-db-ja.com

PHP 7:自分の関数で混合パラメーター型を使用する方法?

混合型のパラメーターを取るPHP 7関数を定義したいと思います。 (私が欲しいのは、C#のジェネリック型パラメーターに相当するものです。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

Test()の呼び出しをコメントアウトすると、コードは正常に実行されるので、関数宣言で混合パラメーター型を使用することは少なくとも問題ありません。

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

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

最後に、単純にパラメーターの型を指定しないことでこれらすべてを回避できることを認識していますが、すべてのパラメーターと戻り値の型を指定することで一貫性を保ちたいと思います。

ありがとうございます。他に情報がありましたらお知らせください。

13
FSharpN00b

FYImixedはタイプではありません。 ( ドキュメントを参照 )。これは、疑似タイプのみです:a Typeがメソッドに渡されるか、メソッドから返される可能性があるというヒント。 。または、おそらく何らかの理由で大まかに型付けされた変数の場合...

C#とは異なり、達成しようとしていることは、PHP特にstrict_typesがtrueに設定されている場合)

ただし、厳密なタイピングを行わなくても、ほぼ同様の効果を得ることができます。この場合、yourメソッドは、タイプヒントを指定しない限り、任意のタイプを受け入れることができます。 C#プログラマにとってはそれは悪いことですが、それでもそれはPHPの力です

13
Poiz

関数がnullも受け入れることを示すために、?-演算子はこれについても動作します http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type -宣言

ただし、この機能はPHP> = 7.1でのみ利用できるため、コードに下位互換性がない場合にのみ使用できます https:// wiki。 php.net/rfc/mixed-typehint RFCとして型ヒントの混合を追加するため、実際には、1つ以上の型を受け入れるパラメータに正しい型ヒントを定義する機会はないようです。

したがって、phpDocコメントが解決策になる可能性があります(また、後方互換性もあります)。例:

/**
* Functiondescription
* @author FSharpN00b
* @param mixed $s
* @return mixed
**/
function test ($s){
    return $s;
}
0