dポイントプレゼントキャンペーン実施中!

<?php $sex=1 ? echo "男性" : echo "女性"; ?>
だと、下記エラーになりました。
Parse error: syntax error, unexpected T_ECHO

試しに、
<?php $sex=1 ? print "男性" : print "女性"; ?>
としたところ、無事表示されました。

echoとprintって同じだと認識していたのですが、
何が違うのでしょうか?

あと、$sex=1ではなく、
$sex==1とした方がよいのでしょうか?

A 回答 (2件)

本当に三項演算子を理解しています?


条件?正の戻り値:偽の戻り値

printは戻り値をもっていて、echoは戻り値をもっていません。
なので戻り値のないechoをしていするとエラーになるのでしょうね

もちろん$sex=1は代入していて正を返しますので三項演算として意味がないですね
$sex==1を使う認識でしょうけど、キャストのことを考えれば$sex===1とすべきでしょう
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2010/12/07 16:16

参考演算子は式です。


マニュアルでは、
---
(expr1) ? (expr2) : (expr3) という式は、
式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。

PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。
---
とあります。

$v=1は、代入です。
上記のプログラムは<?php ?>で完結しているので、$sex=1という式は$sex変数に1を代入することになります。この代入も一応評価されるはずです。なので文法違反にはなっていないのでしょう。

$sex==1に変更しなければなりませんが、元の$sex変数に何の値も代入されていないので結果は不定になりそうです。
まずどこかで$sexの値を決めないと正しくありませんしトラブルのもとになります。

echoについて:
---
echo() は実際には関数ではありません (言語構造です)。このため、使用する際に括弧は必要ありません。
(いくつかの他の言語構造と異なり) echo() は関数のように動作しません。
そのため、 関数のコンテキスト中では常に使用することができません。
加えて、複数のパラメータを指定して echo() をコールしたい場合、括弧の中にパラメータを記述してはいけません。
---

例えば、

<?php
$sex = 0;
echo ($sex == 1) ? "男性" : "女性";
?>

であれば正しく動くはずです。
echo $a+1;
みたいなかんじです。
(カッコはなるべくつけたほうがいいです。優先順位がわかりやすいからです)


ついでに、、、マニュアルから抜粋。
---
// echo は関数のように動作しないので、以下のコードは正しくありません
($some_var) ? echo 'true' : echo 'false';

// しかし、次の例は動作します
($some_var) ? print 'true' : print 'false'; // print も言語構造ですが、
// 関数のように動作します。なので、
// このコンテキスト中で使用できます
echo $some_var ? 'true': 'false'; // 命令を変更
?>
---
動いたのはこういう理由からだと思います。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございました。

お礼日時:2010/12/07 16:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!