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

0

クラスオブジェクトを無名関数に渡すことができます

$uploadImage = function($image, $this)
{
    $this->uploadPictures();
};
于 2013-07-05T09:40:49.053 に答える
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以降は完全に有効です。

usePHP 5.3 では、演算子を使用して同じことを実現できます。

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

usePHP 5.3 より前では、関数の引数を使用してキーワードの使用を避けることができました。

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 に答える