2016-05-18 3 views
1

Я изучал реализацию класса коллекции в своем приложении PHP, однако у меня возникли некоторые вопросы об использовании этого класса.Нелокальные переменные в методе класса коллекции PHP

Я основываю некоторые из своих методов на классе коллекции Laravel (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

Это то, что я искал. Какие версии PHP являются синтаксисом use(). Для этого конкретного приложения я застрял на PHP 5.3.3, поэтому я просто хотел убедиться. – Sean

+0

Не совсем уверен, но я считаю, что анонимные функции стали доступны в 5.3, поэтому я думаю, что это тоже должно быть. Я попробую и дважды проверит –

+0

Я протестировал его в PHP 5.3.3, и он сработал. – Sean

Смежные вопросы