これって、そんなに「エレガントじゃない」「悩ましい」「決してしない」書き方ですか?

意味がよくわからないな。

<?php $a=1;$a=2;$C=$a==$b;echo $c ?>は「何も出力されない」

はてなブックマーク - F's Garage:はじめてWebプログラミングをするなら PHP? Ruby?

はてブコメントに、PHPでも同じ記述できると書いてあったけど、PHPで同じ事をやると、falseの出力が「空白」になります。trueは1です。そういう値を使ってOn/Offスイッチのような処理を書く気には、僕はならないので、決してPHPではこういうことをしません。

F's Garage @fshin2000 :はじめてWebプログラミングをするなら PHP? Ruby?

俺のはてブコメントはこれ

2008年01月03日 j0hn j0hn phpRubyPHPの言語仕様の違い」「それに……こんなのが動く」のやつは、PHPだって式自体は同等のものが使えるんでは。($c = $a == $b;) なにが悩ましいのかもよくわからない / id:f-shin ↑echoじゃなくてvar_dumpしてみては


「そういう値」ってのは「falseが空白として出力され、trueが1として出力されるような値」のこと?

つまり、『論理型 (boolean)の値』のことですか?

$ php -r 'echo true . "\n";'
1
$ php -r 'echo false . "\n";'

$

真偽値をそのまま画面に出力する用事なんて普通はないんだから、「空白や 1 になるから」などという理由で「決してこういうことをしません」なんていうのはちょっと解せない。

(まあしたくないならご自由に、という感じだけど。 「$c = $a == $b」 のような表現は別に無理して使わなくても代替の表現があるわけだし)

でもふつう空白が表示された時点でvar_dumpしてみよう、って思うんでは。

$ php -r '$a = 1; $b = 2; $c = $a == $b; var_dump($c);'
bool(false)
$ php -r '$a = 1; $b = 1; $c = $a == $b; var_dump($c);'
bool(true)
$

たとえば、

$flag = False;

if ($flag) { .... }

みたいなのを、「$flagを出力すると空白や1になるから決してしません」なんていうやつはいないと思う。同じことでは。

そして習得が容易で、php.netに書いてあるリファレンス以外に知る必要がないという部分。

F's Garage @fshin2000 :はじめてWebプログラミングをするなら PHP? Ruby?

確かに「php.netに書いてあるリファレンス」は情報豊富ですね。

PHPの公式マニュアルの何が嫌いかって、公式マニュアルのクセにコメント欄が付いていて、そこに結構重要な情報が書いてあるところ。

さきほどの論理型のページを開いて、ページの一番下を見てみる。

The following expressions are equivalent:
(以下の式は等価です(同じです))

PHP: 論理型 (boolean) - Manual

ある値が偶数かどうか、ってのはこんなふうに書けるよ、と。

<?php
$num = 10;
$isEven = !($num % 2);
?>

"($isEvenの値は、$numが偶数だったら true, そうでなければ false)"

まあ、なくてもいいけど、あればあったで何かの役に立つのかもね。

PHPのマニュアルは他にも色々面白いコメントがあって、例えばxml_set_character_data_handler関数ってのは、最近はあまり使う用事のない関数だと思うけど、コメント欄でこの関数の「ある仕様」について議論されていて、

I think that the "splitting" behaviour should (at least) be mentioned within the documentation, if not explained (please!).

この挙動についてはせめてドキュメントのほうで触れておいて欲しいよなあ!

PHP: xml_set_character_data_handler - Manual

なんて、2005年に発言してる人がいるけど、説明書のほうは全然直っていない。(コメント欄見ればわかるので修正する必要も感じない、といったところか?) なんかコメント欄が「言い訳」になっていて、(ポピュラーな割に)結構、雑なマニュアルだなあ、という印象。

で、条件式の話に戻るけど、実際のコードでも、こういうの使ってる人は、結構いるんじゃない? (いうまでもないことだけど)

このGoogle Code Searchのクエリーは打率が低い(三項演算子とかif文の条件式で代入したりするのも入ってる)けど、それでも、最初のほうの結果ページを何ページかみるだけでも、いくつか、実例をみつけることができる。

$ismssql = (strpos($this->databaseType,'mssql') !== false);
          if ($ismssql) $isaccess = false;
          else $isaccess = (strpos($this->databaseType,'access') !== false);
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
$minor = ($type===DOKU_CHANGE_TYPE_MINOR_EDIT);
          $wasRemoved = ($type===DOKU_CHANGE_TYPE_DELETE);

if文の条件式の結果を変数にしまっておける、ってそんなに変で「悩ましい」? ま、仕事でこれをやって、面倒くさいことを言う人が出てきたら時間(金)の無駄になるから、「決してしない」という選択は、それはそれで正しいとは思うが。(三項演算子とかもそう)

で、おおもとの質問の話だけど、

PHPは、シンプルなハッシュテーブルというデータを持ち回して、データ出し入れして、echoする。

F's Garage @fshin2000 :はじめてWebプログラミングをするなら PHP? Ruby?

俺はむしろ、こういうののほうが、「レガシー」って感じがする。

「本を一週間読んで勉強して掲示板が作りたい」って場合は、その「本」の選択肢がどれくらいあるか、また「掲示板を作る環境(レンタルサーバーとか)」がどれだけ普遍的に存在するか、「時間が限られている(一週間が過ぎたそのあと、どうしたいのかわからない)」などの条件から、PHPを選ぶのは妥当だとおもう。

でも、PHPRubyの言語自体を比較したら、俺はRubyのほうがいいと思う。

本と時間と環境の条件がなくて、単に掲示板作る体験がしたいだけ、っていうんなら、RubyCGIあたりが手ごろだと思うけど。

(ちなみに個人的な好みを言えば、 RubyよりPython のほうが(ちょっと)好き)