Quber
@Quber
PHP Team lead

Почему появляется ошибка при использовании функции preg_replace_callback()?

Вообщем есть такая строчка:
$start_buffer = preg_replace_callback(
    '/<\s*script(?![^>]*\.js)[^>]*>(.*?)<\/script>/s',
    "Compressor::minifyJS",
    $start_buffer
);

Появляется ошибка:
Warning: preg_replace_callback() [<a href='function.preg-replace-callback'>function.preg-replace-callback</a>]: Requires argument 2, 'Compressor::minifyJS', to be a valid callback in D:\OpenServer\domains\test.loc\src\App\CoreBundle\Helper\HtmlCompressor\Compressor.php line 204

В ошибке написано, что второй аргумент в функции вроде как не правильный. Не могу разобраться в чем не правильный.
Вот сама функция:
public static function minifyJS($js)
{
     // какой - то код
}

Вообщем я в тупике. Прошу разобраться именно с этой функцией, а не предлагать альтернативы! Заранее спасибки
  • Вопрос задан
  • 4418 просмотров
Решения вопроса 1
Quber
@Quber Автор вопроса
PHP Team lead
Решено. Проблема была не в правильном синтаксисе, а в области видимости переменных. Спасибо @Melkij за наводку с примером.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
egor_nullptr
@egor_nullptr
в определении метода minifyJS private смените на public и используйте Compressor::minifyJS как callback
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
0) private метод допустим при вызове callback'а из метода этого же класса.
1) Допустимый синтаксис описания callback'ов: http://us2.php.net/manual/en/language.types.callable.php Таким образом начиная с PHP5.2.3 ваш пример верен.
Попробуйте этот пример в своём окружении:
class foo {
	private static function minifyJS($fooo) {
		echo 'called '.__METHOD__;
		return '';
		}

	public static function test() {
		$start_buffer = "<script>foooo</script>";
		$start_buffer = preg_replace_callback(
			'/<\s*script(?![^>]*\.js)[^>]*>(.*?)<\/script>/s',
			"self::minifyJS",
			$start_buffer
		);

		}
	}
foo::test();

Ожидаемый вывод: called foo::minifyJS
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) функция приватна
2) почитайте про колбэки, они задаются для статических функций так: ['Compressor', 'minifyJS']
3) вы не думаете что preg_replace_callback передаст для minifyJS не строку а массив?
4) используйте лучше уж анонимные функции сто бы обойти 2 и 3 пункт.

$result = preg_replace_callback($regexp, function ($matches) {
    // за вот это место не ручаюсь, тут уж сами
    return str_replace($matches[2]. Compressor::minifyJS($matches[2]), $matches[0]);
}, $text)


ну и опять же поскольку этот статический метод приватный - ничего не выйдет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы