За последние 24 часа нас посетили 63270 программистов и 1743 робота. Сейчас ищут 1584 программиста ...

Ошибка Warning: preg_replace()

Тема в разделе "Прочие вопросы по PHP", создана пользователем apelisin, 17 дек 2015.

  1. apelisin

    apelisin Новичок

    С нами с:
    17 дек 2015
    Сообщения:
    4
    Симпатии:
    0
    Всем привет.

    Столкнулся и я с такой ошибкой в php 5.6

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/html/test.site.ru/engine/classes/parse.class.php on line 410

    сама строка

    Код (PHP):
    1. $source = preg_replace( "#\[uppod=([^\]]+)\]#ies", "\$this->build_uppod('\\1')", $source ); 
    переделываем на такую

    Код (PHP):
    1. $source = preg_replace_callback( "#\[uppod=([^\]]+)\]#is", function($m) use ($this){return $this->build_uppod($m[1]);}, $source ); 
    Получаем ошибку

    Fatal error: Cannot use $this as lexical variable.

    да, вот что мне phpinfo говорит

    PHP Version 5.6.14-0+deb8u1
    Apache Version Apache/2.4.10 (Debian)

    Заранее спасибо.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    $this так не передается. скопировать значение $this в другую переменную и её скормить в колбэк
     
  3. apelisin

    apelisin Новичок

    С нами с:
    17 дек 2015
    Сообщения:
    4
    Симпатии:
    0
    А можно конкретно пример, я не совсем понимаю как это сделать. спасибо
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (PHP):
    1. $ths =& $this;
    2. $source = preg_replace_callback('', function($m)use($ths){ return $ths->method($m[1])); 
    дальше сам
     
  5. apelisin

    apelisin Новичок

    С нами с:
    17 дек 2015
    Сообщения:
    4
    Симпатии:
    0
    спасибо большое!
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    На самом деле, $this и так доступен в замыканиях, не нужно ничего делать. Вот этот код работает корректно:
    http://sandbox.onlinephpfunctions.com/code/416078107d33da88 ... 39ea259adb
    Код (PHP):
    1. class A {
    2.    public $b = 5 ;
    3.    function c() {
    4.        
    5.        array_map(function ($e) {
    6.            echo $this->b + $e, PHP_EOL;
    7.        }, [1, 2, 3]);
    8.    }
    9. }
    10.  
    11. $a = new A;
    12. $a->c();
    13.  
     
  7. apelisin

    apelisin Новичок

    С нами с:
    17 дек 2015
    Сообщения:
    4
    Симпатии:
    0
    вопрос решился вот так. спасибо всем за ответы и помощь

    Код (PHP):
    1. $that = $this;
    2. $source = preg_replace_callback( "#\[uppod=([^\]]+)\]#is", function($m) use ($that){return $that->build_uppod($m[1]);}, $source ); 
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Переменную $that можно было и не вводить. См. мой пример
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    бум знать :D