我收到了致命错误:在运行以下代码时,在不在对象上下文中时使用$ this。我正在写一个脚本将我的电子邮件转发到另一个帐户。请帮我。我是php的新手。该错误指向if (is_resource($this->connection))
行。但据我所知,那里的情况很好。
$hostname = '{imap.xyz.com:993/imap/ssl}INBOX';
$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";
}
答案 0 :(得分:0)
$this
仅存在于类的一部分方法中。 $this
不存在于函数中或不属于类的任何其他位置。有关详细信息,请查看有关basic OOP的PHP手册页。
如果您想要引用全局变量$connection
,可以通过将函数的开头更改为:
function Message_Parse($id)
{
global $connection;
if (is_resource($connection))
{
请注意,使用全局变量是任何语言中糟糕的编程习惯。
答案 1 :(得分:0)
只需将$this->connection
更改为$connection
即可。 $this
仅适用于您上课时。此外,您可能需要在功能顶部调用global $connection;
。我相信任何未传递给参数的变量都需要这个名为。
请参阅以下网址查看有关“全球关键字”的信息:http://php.net/manual/en/language.variables.scope.php
答案 2 :(得分:0)
正如所有其他人所说,你不在一个物体内,所以你不能使用$ this。
但是你在函数内部,所以除非你可以访问它,否则你也无法访问这个函数之外的任何变量。
使用global
的解决方案有效,但如果您有一天决定应重命名全局变量$connection
,它会让您陷入地狱。
更好的解决方案是将其作为第二个参数传递给您的函数。
function Message_Parse($id)
应该成为function Message_Parse($id, $connection)
if (is_resource($this->connection))
应该成为if (is_resource($connection))
$id=1; Message_Parse($id);
应该成为$id=1; Message_Parse($id, $connection);
完成。