PHP:OOP问题

JD *_*cks 1 php oop

我对PHP的OOP很新.

好的,首先这会产生错误:

$mail->addBody(new MailWishListInquiry()->getBody(348));
Run Code Online (Sandbox Code Playgroud)

但这不是:

$wishListInquiry = new MailWishListInquiry();
$mail->addBody($wishListInquiry->getBody(348));
Run Code Online (Sandbox Code Playgroud)

我不懂为什么?

此方法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
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?

谢谢!!

编辑:你们已经很好地解释了解除引用在PHP中不起作用.但我仍然需要帮助弄清楚为什么getBody()没有返回字符串.是因为我打破了php所以我不必引用它吗?即使我没有通过它仍然应该返回html字符串对吗?为什么不呢?

谢谢!

Kon*_*lph 11

我不懂为什么?

因为PHP语法任意说明:你不能直接解除引用(作为对象或作为数组)从方法返回值.首先需要将它们分配给变量.

这种行为背后真的没有任何有意义的语义解释.据我所知,这可能会在未来的PHP版本中发生变化.


Sim*_*ann 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();
Run Code Online (Sandbox Code Playgroud)

因此,您无法直接对新创建的对象执行某些操作,但您可以使用方法的返回值执行某些操作.

你的另一个问题是,getBody没有返回任何内容是因为你试图返回在PHP块之外定义的HTML块.您可能认为PHP只会将您在?>和<?php标记之间编写的所有内容都包含在内,并将其作为字符串返回.但它只是将它写入标准输出(通常是您的浏览器)并从没有值的方法返回(void).

要返回HTML字符串,可以使用常规字符串分隔符,如下所示:

function getBody() {
    return
    '<p style="color: red;">Hello</p>
    <p>World</p>';
}
Run Code Online (Sandbox Code Playgroud)