2009-06-16 112 views
1

我对于使用PHP的面向对象方面很新颖。PHP:面向对象方面的问题

OK首先这会产生一个错误:

$mail->addBody(new MailWishListInquiry()->getBody(348)); 

但这并不:

$wishListInquiry = new MailWishListInquiry(); 
$mail->addBody($wishListInquiry->getBody(348)); 

我不明白为什么?

而且方法getBody()没有返回anything..but没有错误either..here是它的一个片段:

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

别人怎么说,你“不能直接取消引用从方法的返回值”是不太正确的。你实际上'只是'不能直接取消引用新创建的类的实例,这是你正在尝试做的。但是,当然也可以做财产以后这样的:

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只是把你所写的所有内容都包含在内? >和<?php标记并将其作为字符串返回。但是,它会将它写入标准输出(通常是您的浏览器),并从方法返回而没有值(void)。

要返回HTML字符串,可以使用普通的字符串分隔符是这样的:

function getBody() { 
    return 
    '<p style="color: red;">Hello</p> 
    <p>World</p>'; 
} 
11

I do not understand why?

由于PHP语法任意这样说:你不能直接解除引用(作为一个对象或作为阵列)从方法返回值。您首先需要将它们分配给变量。

这种行为背后真的没有有意义的语义解释。据我所知,这在未来版本的PHP中会有所改变。

+0

真实的故事,我会*爱*看到这在未来更改 – 2009-06-16 20:09:24

+0

感谢您的解释!你知道为什么getBody()没有返回任何东西吗? – 2009-06-16 20:15:42

1

PHP不允许立即取消引用。你不能这样做:

(new Something())->someMethod(); 
4

至于第一个问题,其他海报是正确的。 PHP不会让你直接解引用返回值。至于第二个,你的getBody()方法将返回null,这不是一个错误(不是逻辑错误)。只要addBody()将接受一个空参数,你的代码就可以工作。

作为一个附注和理智问题,您应该以分号结束getBody()中的返回。在PHP中有这样的例子,如果你在这里把它放在外面,你不需要在分号后面加上分号,如果代码被修改,将来会导致错误。它仍然有效的原因是返回语句是块中的最后一件事。

为了返回HTML而不是呼应它,你需要它是一个字符串:

return '<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">'; 
+0

我添加了分号,但是我将它传递给int 348 ..并且我没有返回任何内容。是因为我打破了PHP的返回字符串,然后又回到了PHP?我能做些什么来解决它?谢谢!! – 2009-06-16 20:11:53

+0

是的。打破php本质上是回应你的文本,而不是返回它。我用解决方案编辑了我的答案。 – 2009-06-16 20:37:22

1

因为每个人都有解释为什么你不能,我会跳过这一部分。但是,你可以这样做:

$mail->addBody(new MailWishListInquiry()->getBody(348)); 

可以

$mail->addBody(MailWishListInquiry::getBody(348)); 

我想。试一试,应该有效。

此外,您的getBody函数没有返回任何内容,并且返回后的所有内容都未执行。 (除非已经改变)

+2

@lyrae 仅当getBody是静态方法时才有效。 – Tom 2009-06-16 20:12:07

1

关于获取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>'; 

}

1

如果你想返回在此问题上)的字符串我建议使用obstart(和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(); 
} 
1

自PHP 5.4

(new Something())->someMethod(); 

是有效的语法。