PHP 5.3.2在匿名函数中使用$this的替代方案


PHP 5.3.2 alternative to using $this inside an anonymous function?

我正在使用Laravel 4和PHP构建一个新的应用程序。它在我运行PHP 5.4.x的开发服务器上运行良好,但我的老板坚持认为它必须运行5.3.2版

我花了一整天的时间来修复5.3.2中的所有内容,并且几乎拥有了所有内容,所以我想,直到我遇到下面代码的问题。

我的问题从这一行开始
DB::transaction(function($clock_in_webcam_image) use ($clock_in_webcam_image)

我相信这种类型的代码可能不适用于这个版本的PHP?如果是这样的话,我有什么选择来运行相同的代码或让它执行相同的操作?

如果有任何帮助,我将不胜感激。非常不幸的是,我的老板直接告诉我,不,他不会允许我们更新到新的PHP,所以我现在陷入了困境

// Create a new time card record when a User Clocks In
public function createTimeCard($clock_in_webcam_image) {
    // Create both Timecard and timecard record tables in a Transaction
    DB::transaction(
        function ($clock_in_webcam_image) use ($clock_in_webcam_image) {
            $timeCard = DB::table('timeclock_timecard')->insertGetId(
                array(
                    'user_id'               => $this->user->user_id,
                    'clock_in_datetime'     => $this->dateTime->format($this->dateFormat),
                    'clock_in_timestamp'    => $this->dateTime->getTimestamp(),
                    'clock_in_webcam_image' => $clock_in_webcam_image
                )
            );
            $timeCardPunchEntry = DB::table('timeclock_punch_entry')
                ->insertGetId(
                    array(
                        'timecard_id'          => $timeCard,
                        'user_id'              => $this->user->user_id,
                        'created_at_datetime'  => $this->dateTime->format($this->dateFormat),
                        'created_at_timestamp' => $this->dateTime->getTimestamp(),
                        'clock_type'           => 'clock_in',
                        'webcam_image'         => $clock_in_webcam_image
                    )
                );
            return $timeCard;
        }
    );
}

更新

针对班思的评论。。。这就是你的意思吗…

DB::transaction(function() use($myModel){
    $myModel->updateTable1();
    $myModel->updateTable2();
})

在PHP 5.4.0之前,您不能在匿名函数中使用$this。不过,有一个简单的解决方法,可以使用use构造将变量传递到函数范围中。此外,由于$clock_in_webcam_image未在父作用域中定义,因此使用use构造的方式不正确。

$user = $this->user;
$dateTime = $this->dateTime;
DB::transaction(function($clock_in_webcam_image) use ($user, $dateTime) {
    // snip
    array(
        'user_id' => $user->user_id,
        'clock_in_datetime' => $dateTime->format($this->dateFormat),
        'clock_in_timestamp' => $dateTime->getTimestamp(),
        'clock_in_webcam_image' => $clock_in_webcam_image
    )
    // snip
});

试试这个。请检查您是否未定义其他insertTimecard

// Create a new time card record when a User Clocks In
public function createTimeCard($clock_in_webcam_image)
{
    // Create both Timecard and timecard record tables in a Transaction
    DB::transaction($this->insertTimecard($clock_in_webcam_image));
}

private function insertTimecard($clock_in_webcam_image)
{
    $timeCard = DB::table('timeclock_timecard')->insertGetId(
        array(
                'user_id' => $this->user->user_id,
                'clock_in_datetime' => $this->dateTime->format($this->dateFormat),
                'clock_in_timestamp' => $this->dateTime->getTimestamp(),
                'clock_in_webcam_image' => $clock_in_webcam_image
        )
    );
    $timeCardPunchEntry = DB::table('timeclock_punch_entry')->insertGetId(
        array(
                'timecard_id' => $timeCard,
                'user_id' => $this->user->user_id,
                'created_at_datetime' => $this->dateTime->format($this->dateFormat),
                'created_at_timestamp' => $this->dateTime->getTimestamp(),
                'clock_type' => 'clock_in',
                'webcam_image' => $clock_in_webcam_image
        )
    );
    return $timeCard;
}