【PHP】ユーザ自作関数の挙動について


function buy($product){
echo $product."を購入しました。<br>";
}

この関数を下記のように利用します。
$kekka = buy("お肉");

すると、

お肉を購入しました。

と表示されます。
どういった仕組みでechoされて表示がされるのでしょうか??

表示されるのはおかしいと考え
試しに下記をおこなったところエラーがおきています。
$aaa = echo "bbb";
Parse error: syntax error, unexpected T_ECHO

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/21 23:04:45
  • 終了:2011/09/27 01:42:48

ベストアンサー

id:nmori No.1

morinatsu回答回数72ベストアンサー獲得回数82011/09/22 01:20:29

echo $product."を購入しました。<br>";

echoで標準出力に書き出された内容が、元文書でコードが書かれている場所「<?php ~?>」の内容に置き換わり、その後、HTMLとして解釈されると考えると分りやすいと思います。


$kekkaへの代入は関数を実行させるための方便で、この場合はechoの「標準出力に文字列を書き出す」という機能だけを利用しています。(この$kekkaの内容を利用している箇所はありましたか?)


$aaaへの代入がエラーになるのは、echoは関数では無いので、それ自身、他の変数に代入可能な値を持たないからです。「変数、関数、リテラルなどがあるはずのところに、変なのが来た!」と驚いているわけです。

id:musicnomy

回答ありがとうございます。

ご説明にて$aaa = echo "bbb";の

$aaaへの代入がエラーになるしくみはわかりました。

ですが、そのしくみでいけば、

$kekkaへの代入も同じ理由でエラーになるのではないでしょうか?

$kekka = buy("お肉"); がエラーが起きずに

表示されている理由がまだわかりません。

2011/09/22 09:40:19
  • id:Lhankor_Mhy
    echo は戻り値がないため代入できません。
    echo を print に変えると代入できるはずです($aaaには1が入ります)。
  • id:rouge_2008
    function buy($product){
    echo $product."を購入しました。<br>";
    }

    関数内でechoしていますよね?
    変数に代入した時に関数が実行されているので表示されます。
    代入時に実行したくない場合は、関数内のechoをreturnに変更してください。
  • id:nmori
    >||
    $kekka = buy("お肉");
    ||<

    これは関数buyを実行(≒計算)した結果を$kekkaに代入するという構文として成立します。
    関数buyの中で戻り値を返していない(return文が無い)ので、$kekkaにはNULLが代入されます。


    $kekkaには意味のある値を返していないので、計算・代入としては意味が無い処理ですが、この場合はechoで文字列を表示させるという”副作用”みたいなものだけを利用しています。(関数buyもそのように使うものとして作られています)

  • id:nmori
    $kekkaの値を後で利用していないなら、

     $kekka = buy("お肉");

    じゃなくて、単に、

     buy("お肉");

    でも同じように動くはず。(自前の環境で試しました)
  • id:musicnomy
    みなさまコメントいただきありがとうございます。

    数日考えていて実験したのですが
    $kekka = print('aaa');
    についてもエラーにならず、aaaとなりました

    1,このことから画面に出力することと、変数に返り値を代入すると言うことは同居できる
    2,返り値が nullや1であれ 正常に変数に入る

    という理解になりました。
    もともと自分の勘違いであったようです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません