7

我试图实现avartaco,就像 gravatar 一样。

为了使它在 php 版本 < 5.3 中工作

如果你想让它在低于 5.3.0 的 PHP 上工作,找到字符串

array_walk($shape, function(&$coord, $index, $mult) { $coord *= $mult; }, self::SPRITE_SIZE);

并重写它以使用 create_function() 而不是 lambda-function。

我在同一行 array_walk 中遇到错误。我Parse error: syntax error, unexpected T_FUNCTION的 php 版本是 5.2.17 <5.3 但我不知道用 createfunction 重写是什么意思?

那么我应该在该行中进行什么更改以使其在 php 版本 < 5.3 中工作

私有函数 GetShape($type) {

    switch($type) {

        case 'side':

            $shape_id = hexdec(substr($this->_hash, 22, 1)) & (sizeof($this->_shapesSide) - 1);

            $shapes = $this->_shapesSide;
        break;
        case 'center':
            $shape_id = hexdec(substr($this->_hash, 23, 1)) & (sizeof($this->_shapesCenter) - 1);

            $shapes = $this->_shapesCenter;
        break;

        case 'corner':
            $shape_id = hexdec(substr($this->_hash, 24, 1)) & (sizeof($this->_shapesCorner) - 1);

            $shapes = $this->_shapesCorner;
        default:
        break;

    }

    $shape = $shapes[$shape_id];
    
    array_walk($shape, function(&$coord, $index, $mult) { $coord *= $mult; }, self::SPRITE_SIZE);
    return $shape;
    
}
4

3 回答 3

7

直到 PHP 5.3 才引入闭包。

由于您运行的是 PHP 5.2.17,因此您需要重写array_walk()才能使用create_function()(如文档所示)。

array_walk(
  $shape,
  create_function('&$coord, $index, $mult', '$coord *= $mult'),
  self::SPRITE_SIZE
);

注意: 我压缩了函数,因为你没有使用$index. 忘了这是一个回调,所以参数很重要。

请考虑至少更新到PHP 5.3。

于 2013-09-10T15:51:30.257 回答
5

只需执行以下操作

array_walk(
    $shape,
    create_function(
        '&$coord, $index, $mult',
        '$coord *= $mult;'
    ),
    self::SPRITE_SIZE
);

我已经在 php < 5.3 中测试了 avatarico,它可以工作!

于 2013-10-09T05:51:02.410 回答
3

或者,array_walk如果您低于 PHP 5.3,您可以通过这种方式使用回调函数

function array_walk_callback(&$coord, $mult){
   $coord *= $mult;
}

array_walk($shape, 'array_walk_callback', self::SPRITE_SIZE);
于 2013-10-04T03:22:49.030 回答