2013-07-05 2 views
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); 
+0

Какую версию PHP вы используете? – sectus

+0

Вы можете перевести часть комментария в свой код? – sinaneker

+0

PHP версия 5.4 – korvinko

ответ

0

Вы можете передать объект класса для анонимной функции

$uploadImage = function($image, $this) 
{ 
    $this->uploadPictures(); 
}; 
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); 
0

От PHP 5.4 $this можно использовать в анонимных функциях (см. Журнал изменений here).

Таким образом, код, например, как это:

<?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(); 
} 

... хотя это довольно уродливо.

Смежные вопросы