2009-06-16 4 views
1

私はPHPでOOPを始めたばかりです。PHP:OOPの問題

このすべての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(); 

だから、あなたが直接、新しく作成されたオブジェクトに何かを行うことはできませんが、メソッドの戻り値で何かを行うことができます。

PHPブロックの外で定義されたHTMLブロックを返そうとしているため、getBodyが何も返さないという別の問題があります。 PHPはあなたが書いたすべてのものを、 >と<?phpタグを返し、文字列として返します。しかし、代わりに標準出力(通常はあなたのブラウザ)に書き出し、値のないメソッド(void)から戻ります。

HTMLの文字列を返すように、あなたはこのような通常の文字列の区切り文字を使用することができます:あなたは私が(obstart使用してお勧めその問題の文字列を返すようにしたい場合)

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

優秀な回答! –

11

I do not understand why?

PHPの構文では、任意にそう言っているので、メソッドから戻り値(オブジェクトまたは配列として)を直接参照することはできません。まずそれらを変数に割り当てる必要があります。

Threreは、この動作の背後にある意味のある意味論的説明ではありません。私が知る限り、これはPHPの将来のバージョンでさらに変更される可能性があります。

+0

真実の話、今後これが変わるのを見てみたいです。 –

+0

その説明をありがとう! getBody()が何も返さない理由を知っていますか? –

1

PHPでは即時参照解除を許可していません。あなたは、このいずれかを実行することはできません。最初の質問については

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

を、他のポスターは正しいです。 PHPでは、戻り値を直接参照解除することはできません。

第2の場合、getBody()メソッドはnullを返します。これはエラーではなく(ロジックエラー以外の)nullです。 addBody()がnullパラメータを受け入れる限り、コードは機能します。

セミコロンでgetBody()の戻り値を終了する必要があります。 PHPの中には、行の最後にセミコロンを置く必要がないインスタンスがあまりないので、ここを省略すると混乱する可能性があり、コードが変更された場合には将来エラーが発生します。それでも動作する理由は、return文がブロック内の最後のものだからです。

代わりにそれをエコーのHTMLを返すために、あなたはそれが文字列である必要があります:あなたは、私はその部分をスキップしますすることができない理由を誰もが説明したように

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

セミコロンを追加しましたが、私はそれをint 348に渡しています。何も返されません。私はPHPの戻り文字列を壊して、PHPに折り返しているからですか?それを修正するために私は何ができますか?ありがとう!! –

+0

はい。 phpの中断は、テキストを返すのではなく、本質的にエコーしています。私は解答を編集しました。 –

1

。しかし、あなたはこれを行うことができます。

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

は、私が思う

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

することができます。試してみてください。うまくいくはずです。

また、getBody関数は何も返さず、戻り後のすべては実行されません。 (これが変更されていない限り)

+2

@lyrae getBodyが静的メソッドである場合にのみ機能します。 – Tom

+0

はうまく動作します。そのPHPは – MrHus

+0

http://us3.php.net/manual/en/language.oop5.basic.phpが動作する例を参照してください。その狂ったIMHOでも、 – MrHus

1

体を取得することについては、私は戻って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>'; 

を}あなたが「直接ではなく、できるメソッドからの戻り値を参照解除」と述べている何他人

+0

ありがとう、それは働いています...それは私がPHPから壊れていたためです...奇妙な...私は前に何の問題もなく多くのことをしてきました。 –

1

をして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(); 
} 
PHP 5.4

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

以来

1

は有効な構文です。

関連する問題