致命错误:不在对象上下文错误中使用 $this [重复]

Posted

技术标签:

【中文标题】致命错误:不在对象上下文错误中使用 $this [重复]【英文标题】:Fatal error: Using $this when not in object context error [duplicate] 【发布时间】:2012-09-25 20:17:18 【问题描述】:

我收到致命错误:在运行以下代码时不在对象上下文中使用 $this。我正在编写一个脚本来将我的电子邮件转发到另一个帐户。请帮我。我是php的新手。错误指向if (is_resource($this->connection)) 行。但据我所知,那里一切都很好。

$hostname = 'imap.xyz.com:993/imap/sslINBOX';
$username = 'aaaaa@xyz.com';
$password = 'xxxxxxxxx';

$connection = imap_open($hostname,$username,$password) or die('Cannot connect to Tiriyo: ' . imap_last_error());

function Message_Parse($id)

    if (is_resource($this->connection))
    
        $result = array
        (
            'text' => null,
            'html' => null,
            'attachments' => array(),
        );
    $structure = imap_fetchstructure($this->connection, $id, FT_UID);

    if (array_key_exists('parts', $structure))
    
        foreach ($structure->parts as $key => $part)
        
            if (($part->type >= 2) || (($part->ifdisposition == 1) && ($part->disposition == 'ATTACHMENT')))
            
                $filename = null;

                if ($part->ifparameters == 1)
                
                    $total_parameters = count($part->parameters);

                    for ($i = 0; $i < $total_parameters; $i++)
                    
                        if (($part->parameters[$i]->attribute == 'NAME') || ($part->parameters[$i]->attribute == 'FILENAME'))
                        
                            $filename = $part->parameters[$i]->value;

                            break;
                        
                    

                    if (is_null($filename))
                    
                        if ($part->ifdparameters == 1)
                        
                            $total_dparameters = count($part->dparameters);

                            for ($i = 0; $i < $total_dparameters; $i++)
                            
                                if (($part->dparameters[$i]->attribute == 'NAME') || ($part->dparameters[$i]->attribute == 'FILENAME'))
                                
                                    $filename = $part->dparameters[$i]->value;

                                    break;
                                
                            
                        
                    
                

                $result['attachments'][] = array
                (
                    'filename' => $filename,
                    'content' => str_replace(array("\r", "\n"), '', trim(imap_fetchbody($this->connection, $id, ($key + 1), FT_UID))),
                );
            

            else
            
                if ($part->subtype == 'PLAIN')
                
                    $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                

                else if ($part->subtype == 'HTML')
                
                    $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1), FT_UID);
                

                else
                
                    foreach ($part->parts as $alternative_key => $alternative_part)
                    
                        if ($alternative_part->subtype == 'PLAIN')
                        
                            echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                            $result['text'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                        

                        else if ($alternative_part->subtype == 'HTML')
                        
                            echo '<h2>' . $alternative_part->subtype . ' ' . $alternative_part->encoding . '</h2>';

                            $result['html'] = imap_fetchbody($this->connection, $id, ($key + 1) . '.' . ($alternative_key + 1), FT_UID);
                        
                    
                
            
        
    

    else
    
        $result['text'] = imap_body($this->connection, $id, FT_UID);
    

    $result['text'] = imap_qprint($result['text']);
    $result['html'] = imap_qprint(imap_8bit($result['html']));

    return $result;
        

return false;

$to      = 'aaaa@gmail.com';
$subject = 'the subject';
$message = 'test';

$id=1;
Message_Parse($id);
$headers = 'From: aaa@xyz.com' . "\r\n" .
    'Reply-To: aaa@xyz.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
$mail = mail($to, $subject, $result, $headers);
if($mail)
echo "YES";
 else
echo "NO";

【问题讨论】:

注意错误信息,你不在一个对象内部,所以不能使用$this。 【参考方案1】:

只需将$this-&gt;connection 更改为$connection$this 仅在您上课时适用。此外,您可能需要在函数顶部调用global $connection;。我相信任何没有传入参数的变量都需要调用这个关键字。

查看“全局关键字”的信息:http://php.net/manual/en/language.variables.scope.php

【讨论】:

谢谢。有效。我还有另一个问题。我想在邮件方法中使用函数的结果。 $results 变量。但想知道如何使用它。我现在所做的方法是返回错误消息未定义变量。请帮忙。【参考方案2】:

正如所有其他人所说,你不在一个对象内,所以你不能使用 $this。

但是你在一个函数内部,所以你也不能访问这个函数之外的任何变量,除非你让它可以访问。

使用global 的解决方案有效,但如果有一天你决定应该重命名全局变量$connection,它会让你下地狱。

更好的解决方案是将其作为第二个参数传递给您的函数。

function Message_Parse($id) 应该变成function Message_Parse($id, $connection)

if (is_resource($this-&gt;connection)) 应该变成if (is_resource($connection))

$id=1; Message_Parse($id); 应该变成$id=1; Message_Parse($id, $connection);

完成。

【讨论】:

【参考方案3】:

$this 只存在于属于类的方法中。 $this 不存在于函数或不属于类的任何其他地方。查看有关basic OOP 的PHP 手册页了解更多信息。

如果您想引用全局变量$connection,可以通过将函数的开头更改为:

function Message_Parse($id)

    global $connection;
    if (is_resource($connection))
    

请注意,在任何语言中使用全局变量都是不好的编程习惯。

【讨论】:

建议将“全局”作为解决方案而不是函数参数的坏业力。 这是他的代码,不是我们的。我们只是就如何使他的代码不会失败提出建议。 @Sven,我并不是建议将其作为解决方案,而是说明如何使用该变量。添加了免责声明。

以上是关于致命错误:不在对象上下文错误中使用 $this [重复]的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:“break”不在“loop”或“switch”上下文中

在静态函数中使用 $this 失败

了解致命错误:无法在写入上下文中使用临时表达式

颤振医生致命,未知修订或路径不在工作树错误中

PHP - 致命错误:无法在写入上下文中使用方法返回值

致命错误:在非对象上调用成员函数 getLoginUrl()