2013-04-06 22 views
5

Silexで何が起こっているのか、そして一般的な新しいish PHPの機能について深く理解したいと思っています。これは、サイレックスの文書の「使用」ページ上のコードサンプルをオフに基づいています:"use"とコントローラー関数へのパラメーターの受け渡しの違い

$blogPosts = array(
    1 => array(
     'date'  => '2011-03-29', 
     'author' => 'igorw', 
     'title'  => 'Using Silex', 
     'body'  => '...', ); 

$app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) { 
    //do stuff 
} 

質問

  • パラメータとして$app$idを渡すとのここでの違いは何ですかを使用すると、$blogPosts変数になりますか?

  • また、パラメータとして、$blogPostsが渡されましたか?

  • また、より一般的には、use ($app)を参照してください。 の相違点は何ですか- $appのパラメータですか?

答えて

7

これは、silexと「すべての新しいPHP機能」とは関係がありません。 異なる$app$idの値で複数回再利用可能な匿名関数(クロージャとも呼ばれます)を作成していますが、同じ$blogPostsの値しか使用できません。ここで

<?php 
$a = "a"; 
$b = "b"; 
$c = function ($d) use ($b) { 
    echo $d . "." . $b . PHP_EOL; 
}; 
$b = "c"; 
$e = function ($d) use ($b) { 
    echo $d . "." . $b . PHP_EOL; 
}; 

$c($a); // prints a.b, and not a.c 
$e($a); // prints a.c 

、私は$ bに機能を構築していますし、それが構築されたら、私は、関数の引数の名前は同じように命名する必要がない変数でそれを使用しています。

+1

まだ私の頭を包み込むようにしていますが、あなたの例は間違いなく役に立ちます。 "use"は、useステートメントが*宣言されたときに存在する$ bの値を参照し、useステートメントを含む関数が*呼び出されたときに気にすることは興味深い。したがって、「使用」の種類は、それが接続されているクロージャの環境を定義します。私は '$ b =" c ";'の下で別の関数 '$ e = function($ f)use($ b){//同じもの};を呼び出して' $ e($ a) 'は" ac "私はこれを得ていますか? – patricksayshi

+0

はい、私の更新を参照してください – greg0ire

+0

最高の例 – user2907171

0

使用すると、変数を親スコープからクロージャスコープにインポートできます。

get()関数は親スコープからインポートされた適切なパラメータ$ blogPostsを使用してクロージャを呼び出すことができます。

関連する問題