#php #regex #telegram
#php #регулярное выражение #telegram
Вопрос:
Я создаю Telegram-бота, используя PHP. У меня есть bot.php , filter.php и test.php .
Я хочу, чтобы мой бот отправил пользователю сообщение, содержащее идентификатор. У меня есть класс Filter, и у меня есть функция в моем filter.php с шаблоном регулярных выражений для определения этого идентификатора, и я использую preg_match для получения соответствия.
public function getID($string) {
$pattern = "/e0(d){6}b/i";
preg_match($pattern, $string, $matches);
return $matches[0];
}
В моем test.php Я использую эту функцию, и она смогла выдать мне совпадение.
<?php
include __DIR__ . './filter.php';
$check = new Filter();
$pattern = "/e0(d){6}b/i";
$text = "hi e0000000";
echo "id: ".$check->getID($text);
?>
В моем bot.php Я пытаюсь использовать ту же функцию для отправки сообщения, но это не работает. (функция sendMsg — это просто http-запрос curl к API Telegram Bot)
include __DIR__ . './filter.php';
$filter = new Filter();
function handleGoodMessage($chatId, $text) {
$report = "Message '".$text."' passed the filters.nID: ".$filter->getID($text);
sendMsg($chatId, $report);
}
Вместо этого, всякий раз, когда вызывается функция, бот возвращает внутреннюю ошибку сервера 500.
Пожалуйста, помогите.
Ответ №1:
$filter
недоступно внутри функции.
$filter = new Filter(); //<--- filter is here, in the outer scope
function handleGoodMessage($chatId, $text) {
$report = "Message '".$text."' passed the filters.nID: ".$filter->getID($text);
//this scope is inside the function, $filter does not exist here
sendMsg($chatId, $report);
}
Это работает в тесте, поскольку вы не меняете область видимости. Вам нужно передать $filter
в
——ОБНОВИТЬ—-
лично я бы всегда полагался на внедрение, а не на использование globals
, поэтому я предпочел бы переопределить функцию следующим образом:
function handleGoodMessage($chatId, $text, $filter) {
$report = "Message '".$text."' passed the filters.nID: ".$filter->getID($text);
sendMsg($chatId, $report);
}
Я бы, вероятно (с риском расстроить некоторых людей) getID
определил как a static function
, потому что на самом деле он ни с чем не взаимодействует, не использует никаких переменных-членов, а просто обрабатывает строку и возвращает ее. Таким образом, вместо того, чтобы вводить его или использовать global
, вы могли бы сказать
function handleGoodMessage($chatId, $text) {
$report = "Message '".$text."' passed the filters.nID: ".Filter::getID($text);
sendMsg($chatId, $report);
}
Комментарии:
1. итак, мне нужно добавить
global $filter;
внутри функции?2. @Jerryl Я бы не рекомендовал использовать
global
, использование глобальных значений обычно является признаком плохого шаблона проектирования. Я расширил свой ответ для вас, но я бы рекомендовал провести еще несколько исследований о области видимости