こいつはPHPのせいじゃない、日本人のせいだ

正直驚いた。PHPがいくらか設計ヘタクソなのがかわいく思えるぐらい、びびった。英語読めないバカがマニュアル翻訳するな。

PHP: 関数の引数 - Manual

にある謎の一文

注意: PHP 5以降、デフォルトで値はリファレンス渡しとなります。

をちゃんと理解しないといけないので、読み返しました。

この一文が登場するまで、マニュアルには、明示的にリファレンス渡しする方法は書いてあるけど、明示的に値渡しする方法は書いてありません。そんなこと言われたら、どうやってPHP5でリファレンス渡しを解除して、値渡しにしたらいいんだろう?マニュアルのライターが錯綜した仕様のせいで混乱したのかな。PHPのリファレンス変数とオブジェクトの仕様変更あたり、かなり難しいから、かわいそうに。うーん、でも本当にどうなってるんだろう。ソース見るしかないかなぁ…。

なんちゃって、まじめに読んだ方は残念でした。

こういうときは原文を読もう。で、開いた英語マニュアル(PHP: Function arguments - Manual)では、

Note: As of PHP 5, default values may be passed by reference.

となっています。ふむふむ…

「PHP5では、デフォルト値はリファレンスで渡されることがあります」
---- 全然意味ちゃうやんけ。

ためしに、Yahoo!翻訳に読ませてみます。

注:PHP 5現在、デフォルト値は参照によって超えられるかもしれません。

おしい。じゃあ、口語的な表現にはめっぽう弱い Googleの翻訳だと、

PHP 5では、デフォルト値を参照渡しすることがあります。

意外にもバッチリ(w
人が翻訳してる意味ないぞ。


うーむ、中卒ぐらいの英文法できて、簡単な英語を日常的に読んでるなら、まずこんな間違いするはずないよね。default の前に as もなけりゃ、後にカンマないでしょ。明らかに values とセット。さらに、default って、どう転んでも副詞として読めない。もし何か副詞を置いて be passed にかけたいんだったら、may の後か passed より後じゃないとダメ。変な英文もありうる? いやいや、マニュアルなんだから、意味ない転置で誤解を招く表現が突然出てくることはないだろうに。

まあ、百歩譲って、英語苦手なのによく頑張ってここまで書いたな、と思おうとしても、やっぱり、日本語として読んで技術的におかしいことに気づくべきだったし、何より、この程度の文章が読めない、かつ、論理的に矛盾ないか理解できないなら、寄稿すべきじゃない。

この批評のポイントは、慣れた人でも間違う間違いじゃなくて、慣れた人なら絶対に間違えない間違いをしていることね。ただのタイプミス? いや、だから一度でも「で」をタイプするはずないんだってば。




ついでに、

PHP: What References Do - Manual

から

PHP: リファレンスが行うことは何ですか? - Manual

の翻訳にも妙な感じのところがあります。翻訳者は references と reference を同じ「リファレンス」と翻訳してるけど、単数形は「参照」という動名詞で、複数形には「参考文献」っていう、物理的なニュアンスがあるみたい。

reference が単数形か複数形かに注意してこの文章を英語で読むと、原著では場合に応じて使い分けていることがわかる。で、複数形を、値の引用物、単数形を参照行為として読むと、あのややこしいリファレンスの説明が、少しはわかりやすくなるかも。

Since PHP 5, new returns a reference automatically, so using =& in this context is deprecated and produces an E_STRICT message.

ここ、

PHP 5 以降、new は自動的にリファレンスを返すようになりました。そのため、この場面で =& を使用することは非推奨となり、 E_STRICT レベルのメッセージが表示されるようになりました。

は、やっぱり誤訳っぽい。なぜって、原文は returns a reference であって、returns references じゃないもの。a が付いてるから、より一般的な意味で「参照」と言っている(C++の参照のようなものかな)のであって、この説明で語っているPHP独特な references (変数引用) のことではないと思うのです。
じっさいに試したら、たしかに、new から得られたものはポインタのように振舞ったけど、references としての特徴はありませんでした。

これは原文がややこしいよね、自分でも解釈あんまり自信ない。

Since PHP 5, operator "new" returns an absolutely referenced value, ...

とか、原文でも明確に違うように書いておけばよかったのに。