2016-05-18 6 views
1

私はPHPアプリケーションにコレクションクラスを実装しようとしていましたが、クラスの使用についていくつか質問がありました。PHPコレクションクラスメソッド内の非ローカル変数

私はLaravel Collection Class(https://laravel.com/docs/5.2/collections)に私のメソッドのいくつかを基づいています。

私は.eachメソッド使用していた場合:私はコールバックで非ローカル変数を使用するにはどうすればよい

public function each($callback) 
{ 
    foreach ($this->items as $key => $item) { 
     if ($callback($item, $key) === false) { 
      break; 
     } 
    } 

    return $this; 
} 

を?たとえば、コースコレクションとユーザーコレクションがあります。

$courses = new Collection($this->getCourses()); 
$users = new Collection($this->getUsers()); 

// I need to loop through all courses and within each course, loop through 
// all users 
$courses->each(function($course, $courseKey) { 

    // How can I make it so $users is available here? 

    $users->each(function($user, $userKey) { 

     // How can I make it so $course is available here? 

     // ... 
    }); 
}); 

私は悪い習慣を達成しようとしていますか? globalキーワードを使用する必要がありますか、それとも悪い習慣ですか?

答えて

1

this manual entryを参照してください。あなたが探しているのは、変数の周りにクロージャを作成することです(このマニュアルでは、「の親スコープの変数を継承する」というフレーズが使用されています。)。このような何かあなたのために働くべき:

$courses = new Collection($this->getCourses()); 
$users = new Collection($this->getUsers()); 

$courses->each(function($course, $courseKey) use($users) { 

    // $users is now available in this scope 

    $users->each(function($user, $userKey) use($course) { 

     // $course is now available in this scope 

    }); 
}); 

あなたはそれが特に私はあなたの変数を疑うグローバル範囲内に存在する変数を参照しますので、globalキーワードを使用する必要はありません(実際にありますそれらが関数またはクラス内で宣言されている場合、それらはグローバルではありません)。マニュアルの関連引用:

親スコープから変数を継承することは、グローバル変数を使用することと同じではありません。グローバル変数はグローバルスコープ内に存在します。グローバルスコープは、どの関数が実行されていても同じです。クロージャの親スコープは、クロージャが宣言された関数です(必ずしも呼び出された関数である必要はありません)。

+0

これは私が探していたものです。使用可能なuse()構文はPHPのどのバージョンです。この特定のアプリケーションでは、私はPHP 5.3.3に固執しているので、私はちょうど確かめたいと思っていました。 – Sean

+0

私はあまりよく分かりませんが、5.3で匿名の機能が利用できるようになったと思いますので、これも同様だと思います。私は試してみるとダブルチェック –

+0

私はPHP 5.3.3でそれをテストし、それが働いた。 – Sean

関連する問題