为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:类函数在一个文件中起作用,但在另一个文件中不起作用

PHP:类函数在一个文件中起作用,但在另一个文件中不起作用

PHP
Qyouu 2023-10-21 17:20:52
我正在使用 PHP 制作一个 Telegram 机器人。我有 bot.php、filter.php 和 test.php。我希望我的机器人向用户发送一条包含 ID 的消息。我有一个 Filter 类,并且我的 filter.php 中有一个带有正则表达式模式的函数来检测此 id,并且我正在使用 preg_match 来获取匹配项。public function getID($string) {    $pattern = "/e0(\d){6}\b/i";    preg_match($pattern, $string, $matches);    return $matches[0];}在我的 test.php 中,我使用该函数,它能够向我回显匹配项。<?phpinclude __DIR__ . './filter.php';$check = new Filter();    $pattern = "/e0(\d){6}\b/i";$text = "hi e0000000";echo "id: ".$check->getID($text);?>在我的 bot.php 中,我尝试使用相同的函数发送消息,但它不起作用。(sendMsg 函数只是对 Telegram Bot API 的简单curl http 请求)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 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

$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);

    }


查看完整回答
反对 回复 2023-10-21
  • 1 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信