PHP 5.3.0 USE标识符

时间:2011-05-04 15:11:49

标签: php php-5.3

昨天我问了一个关于USE标识符的问题,答案是PHP 5.3.0 USE keyword -- how to backport in 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 个答案:

答案 0 :(得分:2)

PHP在5.3之前没有匿名函数。您必须使用callback types中的任何一个。因为这会变得更加困难,而且对于像你这样的用例来说不是很惯用,我建议你应用命令式编程风格。

$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);

答案 1 :(得分:0)

更新回答:

虽然原始问题的答案是正确的,并且确实允许您在php 5.2中轻松使用array_filter,但没有闭包;简单地做一个for循环会更容易:

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

更改为:

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

   if (/* condition */) {

      $output[$key] = $value;

   }

}

答案 2 :(得分:0)

在“封闭”下的手册http://www.php.net/manual/en/functions.anonymous.php中粗略地涵盖了这一点。

use ($var)所做的是在匿名函数和父作用域之间共享一个变量。通常它只保留初始值,并将该参数实际上转换为静态变量。

要将其转换为PHP 5.2兼容构造,最好将闭包转换为静态回调函数。而不是= function () {}写一个普通的声明:

function cb_event_filter_week($event_object) {

一种非常不漂亮的方式是通过全局范围共享闭包/ 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中使用它们