PHP: функция класса работает в одном файле, но не в другом

#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 , использование глобальных значений обычно является признаком плохого шаблона проектирования. Я расширил свой ответ для вас, но я бы рекомендовал провести еще несколько исследований о области видимости