PHP:OOP问题

时间:2009-06-16 19:58:36

标签: php oop

我对使用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字符串对吗?为什么不呢?

谢谢!

8 个答案:

答案 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();

是有效的语法。