我对使用PHP的OOP很新。
好的,首先这会产生错误:
$mail->addBody(new MailWishListInquiry()->getBody(348));
但这不是:
$wishListInquiry = new MailWishListInquiry();
$mail->addBody($wishListInquiry->getBody(348));
我不明白为什么?
此方法getBody()也没有返回任何内容..但也没有错误..还有一段代码:
function getBody($pid)
{
$qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
$result = mysql_query($qry);
$row = mysql_fetch_assoc($result);
$item_name = $row['product_name'];
$item_url = 'product.php?pid='.$pid;
$item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];
return
?>
<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">
...
</div>
<?php
}
有谁知道为什么?
谢谢!
编辑:你们已经做得很好,解释说解除引用在PHP中不起作用。但我仍然需要帮助弄清楚为什么getBody()没有返回字符串。是因为我打破了php所以我不必引用它吗?即使我没有通过它仍然应该返回html字符串对吗?为什么不呢?
谢谢!
答案 0 :(得分:11)
我不明白为什么?
因为PHP语法任意说明:你不能直接解除引用(作为对象或作为数组)从方法返回值。首先需要将它们分配给变量。
这种行为背后真的没有任何有意义的语义解释。据我所知,这可能会在未来的PHP版本中发生变化。
答案 1 :(得分:8)
其他人说你“不能直接从方法中取消引用返回值”并不完全正确。你实际上'只是'不能直接取消引用新创建的类实例,这正是你想要做的。但是当然可以做这样的事情:
class Test {
public function a() {
echo "a";
return $this;
}
public function b() {
echo "b";
return $this;
}
public function c() {
echo "c";
return $this;
}
}
$test = new Test();
$test->a()->b()->c();
所以你不能直接用新创建的对象做某事,但你可以用方法的返回值做点什么。
你的另一个问题是,getBody没有返回任何内容是因为你试图返回在PHP块之外定义的HTML块。你可能会认为PHP只是把你在#&gt;之间写下的所有东西都拿走了。和&lt;?php标记并将其作为字符串返回。但它只是将它写入标准输出(通常是您的浏览器)并从方法返回而没有值(void)。
要返回HTML字符串,您可以使用这样的普通字符串分隔符:
function getBody() {
return
'<p style="color: red;">Hello</p>
<p>World</p>';
}
答案 2 :(得分:4)
至于第一个问题,其他海报是正确的。 PHP不允许您直接取消引用返回值。
对于第二个,你的getBody()方法将返回null,这不是错误(逻辑错误除外)。只要addBody()接受null参数,您的代码就可以工作。
作为旁注和理智问题,你应该用分号结束getBody()中的返回。在PHP中有这么几个实例,你不需要在一行结尾处使用分号,如果你把它留在这里就会混淆,如果代码被修改,将来会导致错误。它仍然有效的原因是return语句是块中的最后一个。
为了返回html而不是回显它,你需要它是一个字符串:
return '<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">';
答案 3 :(得分:1)
PHP不允许即时取消引用。你不能这样做:
(new Something())->someMethod();
答案 4 :(得分:1)
每个人都解释了为什么你不能,我会跳过那一部分。但你可以这样做:
$mail->addBody(new MailWishListInquiry()->getBody(348));
可以
$mail->addBody( MailWishListInquiry::getBody(348));
我认为。尝试一下,应该有用。
此外,您的getBody函数没有返回任何内容,并且返回后的所有内容都不会执行。 (除非这已经改变)
答案 5 :(得分:1)
关于get body,我从未见过返回返回php之外的东西。但这很可能是php怪癖之一。但这应该有效:
<?php
function getBody($pid)
{
$qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
$result = mysql_query($qry);
$row = mysql_fetch_assoc($result);
$item_name = $row['product_name'];
$item_url = 'product.php?pid='.$pid;
$item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];
return '<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;"></div>';
}
答案 6 :(得分:1)
如果你想返回一个字符串,我建议使用ob_start()和ob_get_contents
function getBody($pid)
{
$qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
$result = mysql_query($qry);
$row = mysql_fetch_assoc($result);
$item_name = $row['product_name'];
$item_url = 'product.php?pid='.$pid;
$item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];
ob_start();
?>
<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">
...
</div>
<?php
return ob_get_contents();
}
答案 7 :(得分:1)
自php 5.4
(new Something())->someMethod();
是有效的语法。