PHP 5.3.0 USE-идентификатор - PullRequest
0 голосов
/ 04 мая 2011

Вчера я задал вопрос об идентификаторе USE, и на него ответили Ключевое слово USE PHP 5.3.0 - как сделать бэкпорт в 5.2? .

Однако мне пришлось расширитьмой сценарий, чтобы сделать это дважды и неуверенный, как я приспосабливаю и

$available_event_objects  = array_filter($event_objects, function ($event_object) use ($week_events) { 
    // keep if the event is not in $week_events
    return !in_array($event_object, $week_events);
  });`

и

$calendar_weeks[$week_count][$calendar_date] = array_filter($available_event_objects, function ($event_object) use ($date_pointer) { 
    // keep if the event is happening on this day
    return ($date_pointer >= $event_object->start_date && $date_pointer <= $event_object->end_date);
  });`

Как я могу изменить это, чтобы заставить это работать в 5.2.9?

Может ли кто-нибудь указать мне правильное направление ??

Приветствия

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

В PHP не было анонимных функций до 5.3.Вместо этого вы должны использовать любой из типов обратного вызова .Поскольку это становится более сложным и не очень идиоматичным для таких вариантов использования, как ваш, я бы посоветовал вам вместо этого применять императивный стиль программирования.

$available_event_objects = array();
foreach ($event_objects as $event_object) {
    if (in_array($event_object, $week_events)) {
        $available_event_objects[] = $event_object;
    }
}

Тем не менее, для этого случая вы можете свободно использовать array_intersect, т.е.$available_event_objects = array_intersect($week_events, $event_objects);

0 голосов
/ 04 мая 2011

Это исключительно схематично описано в руководстве http://www.php.net/manual/en/functions.anonymous.php в разделе "Затворы".

Что делает use ($var), так это разделяет переменную между анонимной функцией и родительской областью действия. Обычно он просто сохраняет первоначальное значение и превращает этот параметр практически в статическую переменную.

Чтобы превратить его в совместимую с PHP 5.2 конструкцию, всегда лучше превратить замыкания в статические функции обратного вызова. Вместо = function () {} напишите обычную декларацию:

function cb_event_filter_week($event_object) {

Очень нехороший способ - использовать переменную closure / use через глобальную область видимости. Для этого переписать функцию на

function cb_event_filter_week($event_object) {
     global $week_events;

Вы должны будете сделать то же самое в родительской функции, а также для ее инициализации! И очень желательно дать этой переменной значительно более уникальное имя. Более хорошей альтернативой здесь была бы статическая переменная, если вам нужно только вызвать эту функцию обратного вызова в одной точке (!) В потоке приложения:

function cb_event_filter_week($event_object) {
     static $week_events = 0;

Действительно зависит от того, как оно используется. Но в любом случае вы можете написать = array_filter($event_objects, "cb_event_filter_week") для их использования в PHP 5.2

0 голосов
/ 04 мая 2011

Обновленный ответ:

Хотя ответ в исходном вопросе верен и позволяет легко использовать array_filter в php 5.2, без замыканий; проще будет сделать цикл for:

$output = array_filter($input, function($input) use ($stuff) { return /* condition */ } );

Меняется на:

$output = array();
foreach($input as $key=>$value) {

   if (/* condition */) {

      $output[$key] = $value;

   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...