0

如何在匿名函数中检索类的方法?是否存在解决此问题的其他机会?

任务:我需要从远程路径上传图像并将其更改为本地路径。

代码:

    $pattern = '/<img src=(.*?jpg|gif|png).*?>/m';

    $uploadImage = function($image)
    {
        $this->uploadPictures();
    };

    function image_replace($matches) use ($uploadImage)
    {
        // как обычно: $matches[0] -  полное вхождение шаблона
        // $matches[1] - вхождение первой подмаски,
        // заключенной в круглые скобки, и так далее...
        $uploadImage($matches[1]);

        return $matches[1].($matches[2]+1);
    }

    preg_replace_callback(
        $pattern,
        "image_replace",
        $text);
4

3 回答 3

1
$pattern = '/<img src=(.*?jpg|gif|png).*?>/m';

$uploadImage = function ($image) {
    $this->uploadPictures();
};

$image_replace = function ($matches) use ($uploadImage) {
    $uploadImage($matches[1]);
    return $matches[1].($matches[2]+1);
};

preg_replace_callback($pattern, $image_replace, $text);

或者

$pattern = '/<img src=(.*?jpg|gif|png).*?>/m';

$image_replace = function ($matches) {
    $this->uploadPictures($matches[1]);
    return $matches[1].($matches[2]+1);
};

preg_replace_callback($pattern, $image_replace, $text);

或者

$pattern = '/<img src=(.*?jpg|gif|png).*?>/m';

preg_replace_callback($pattern, function ($matches) {
    $this->uploadPictures($matches[1]);
    return $matches[1].($matches[2]+1);
}, $text);
于 2013-07-05T09:47:05.477 回答
0

从 PHP 5.4 开始$this,可以在匿名函数中使用(请参阅此处的更改日志)。

因此,像这样的代码:

<?php
class A
{
    public function test()
    {
        $f = function()
        {
            return $this->callback();
        };
        return $f();
    }

    public function callback()
    {
        return 'test';
    }
}

$a = new A();
echo $a->test();

从 5.4 开始完全有效。

在 PHP 5.3 中,您可以使用运算符实现相同的目的use

public function test()
{
    $_this = &$this;
    $f = function() use (&$_this)
    {
        return $_this->callback();
    };
    return $f();
}

在 PHP 5.3 之前,您可以use通过使用函数参数来避免使用关键字:

public function test()
{
    $f = function($_this)
    {
        return $_this->callback();
    };
    return $f($this);
}

最后,当涉及到静态方法时,您还可以使用__CLASS__常量。

public function test()
{
    $f = function()
    {
        return call_user_func(array(__CLASS__, 'callback'));
    };
    return $f();
}

……虽然很丑。

于 2013-07-05T09:50:43.053 回答
0

您可以将类对象传递给匿名函数

$uploadImage = function($image, $this)
{
    $this->uploadPictures();
};
于 2013-07-05T09:40:49.053 回答