2016-05-02 9 views
1

戻り値タイプの両方を指定する関数を作成して、useにすることはできますか?戻り値タイプと "使用"キーワードを持つ関数

以下の例は間違っていますか、サポートされていませんか(まだ)?

<?php 

$arr = ['test' => 'value']; 

function test1() use ($arr) : string { // Line 5 
    return $arr['test']; 
} 
function test2() : string use ($arr) { 
    return $arr['test']; 
} 

エラーは次のとおりです。

Parse error: syntax error, unexpected 'use' (T_USE), expecting '{' in [PATH]\index.php on line 5

することができますrun the code here

+2

'use'キーワードは、calllng-context変数を* closure *に束縛するためのもので、function文で定義された関数はクロージャではありません。だからこそ、それは意味をなさないので単純に機能しません。おそらくこれをやろうとしているのですか?つまり、ここで最後のゲームは何ですか?それを明確にすることは、別のアプローチを思いつくのに役立つかもしれない。また、なぜ... PHPのような動的な緩やかなタイプのlangaugeでは、ローカル関数の型チェックを行うことが重要ですか?公表されたAPIなどの一部になるのではないのですか? –

+0

ああ、もちろん。 'global'キーワードは私が探しているものです。私は以前にそれを実際に使ったことはないと思うので、私には起こりませんでした。理由:私は、名前空間ユーティリティ関数の長いリストを維持していて、それらを構成可能にしたかったのです。ネームスペースの一番上に配列をロードし、関数にアクセスできるようにすることは、私が考えるエレガントなソリューションです。誰かがヘルパークラスや依存関係を記述する前に、気にしないでください。私は大槌を必要としていません。私はメスを探しています。 –

+0

私はこれらの提案はあなたが1つとして使用しようとしているような小さじよりもメスに近いと思っています;-)しかし、それぞれ自分自身に、ええ? –

答えて

0

コメントでAdam Cameronと答えたところ、use言語構成はclosuresにのみ適用され、一部の機能には適用されません。したがって、それを通常の関数で使用することは意味をなさないので、パーサによって理解されません。

例のコードの関数がクロージャであった場合、すべてが機能していました。

$arr = ['test' => 'value']; 

$fn = function() use ($arr) : string { 
    return $arr['test']; 
}; 

echo($fn()); // outputs 'value' 

run the code hereです。

最初の試行は正しいことに注意してください。最初にuseステートメント、次にreturn type declarationステートメント。これらの2つを逆にしようとすると、解析エラーが発生します。

関連する問題