2009-06-16 113 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(); 

是有效的語法。