微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型:错误消息:不在对象上下文中时使用$ this

如何解决类型:错误消息:不在对象上下文中时使用$ this

我的代码错误。我想在 index 函数调用 get_mail()函数。此代码是带有PHPcodeigniter消费者代码的Rabbitmq,错误消息为:

类型:错误

消息:找不到类“ get_mail”

文件名:C:\ xampp \ htdocs \ mail \ application \ controllers \ Consumer.PHP

行号:45

<?PHP 


defined('BASEPATH') OR exit('No direct script access allowed');
    


require_once APPPATH.'../vendor/autoload.PHP';
use PHPAmqpLib\Connection\AMQPStreamConnection;
use PHPAmqpLib\Exchange\AMQPExchangeType;
class Consumer extends CI_Controller {
public function index(){
     
    
    $host = "secret";
    $port = 5672;
    $user = "secret";
    $pass = "secret";
    $vhost = "secret";
    $exchange = 'router';
    $queue = 'mail';
    $consumerTag = 'consumer';

    $connection = new AMQPStreamConnection($host,$port,$user,$pass,$vhost);
    $channel = $connection->channel();

    $channel->queue_declare($queue,false,true,false);

    $channel->exchange_declare($exchange,AMQPExchangeType::DIRECT,false);

    $channel->queue_bind($queue,$exchange);
    function process_message($message)
    {

        $pesan = json_decode($message->body);
        $isi = $pesan->email;
        $this->get_mail();
        $message->ack();


    }

    $channel->basic_consume($queue,$consumerTag,'process_message');
    function shutdown($channel,$connection)
    {
        $channel->close();
        $connection->close();
    }

    register_shutdown_function('shutdown',$channel,$connection);
    while ($channel ->is_consuming()) {
        $channel->wait();
    }
    
}

public function get_mail($isi){
    //this is function for send mail in codeigniter
}

   

  
    
   
    // Loop as long as the channel has callbacks registered
   
}

/* End of file Consumer.PHP */


?>

这是来自PHP错误消息: 类型:错误

消息:不在对象上下文中时使用$ this

文件名:C:\ xampp \ htdocs \ mail \ application \ controllers \ Consumer.PHP

行号:45

解决方法

正如我所看到的,您需要创建该类的单独对象以使用get_email。 问题是: process_message由Queue执行,并且内部Queue类没有get_email,这就是为什么出现错误的原因-未找到。

可能的解决方案:为电子邮件创建一个单独的类,并在需要时甚至在您的方法中创建对象。

,

PHP不支持嵌套函数,因此当您编写这样的代码时...

class X {
    public function foo() {
        function bar() {
            echo "hello world";
            var_dump($this); // this will give an error
        }

        something_needing_a_callback('bar');
    }
}

...实际上,您只是在声明一个名为bar global 函数,它与类X没有关系;就像您已编写此代码一样(除了在运行foo之前不会声明该函数):

class X {
    public function foo() {
         something_needing_a_callback('bar');
    }
}
function bar() {
    echo "hello world";
    var_dump($this); // $this has no meaning here,we are not inside a class
}

您可能正在寻找的是closures,又名匿名函数,它可以 从其周围的范围“捕获”或“绑定”变量,并自动绑定$this ;所以你可以这样写:

class X {
     public function foo() {
          $myBarFunction = function() {
                echo "hello world";
                var_dump($this); // works :)
          }
          something_needing_a_callback($myBarFunction);
     }
}

或者,您可以在类上编写一个命名方法,并将其用作回调using the syntax for referencing callables,但请注意,该方法必须是公共的,因为最终将调用它的函数不在类内部:

class X {
    public function foo() {
         something_needing_a_callback([$this,'bar']);
    }

    public function bar() {
         echo "hello world";
         var_dump($this); // OK,because just an ordinary method
    }
}

希望您能弄清楚如何将其应用于实际代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。