如何解决类型:错误消息:不在对象上下文中时使用$ 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 */
?>
消息:不在对象上下文中时使用$ 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 举报,一经查实,本站将立刻删除。