web-dev-qa-db-ja.com

php文字列連結演算子がドット(。)である理由

PHPでは、 文字列演算子 ドット(。)を使用して文字列を連結します。例えば:

$msg = "Hello there, " . $yourName;

特に、2つの文字列を連結するために使用すると、操作はエラーをスローせず、単に「静かに」失敗するため、ドット演算子は常に(私も含めて)人々を混乱させます。これは、PHPと、この演算子を使用しないJavaScript、Pythonなどの他の言語との間で切り替えるときにもよくある間違いです。

私の質問は、言語がプラス(+)などのより広く受け入れられている演算子の代わりにドット(。)演算子を使用するのはなぜですか?この演算子が選択された理由について指摘できる歴史的な理由はありますか?ドットが他の変数型を文字列にキャストできるからでしょうか?例えば:

echo 1 . 2;                //prints the string "12"

ありがとう!

38
Justin Ethier

Dotとplusはまったく異なることをするので、別の演算子を使用することをお勧めします。

非特定の言語の観点から、"a string" + "another string";は実際にはどういう意味ですか?

どういう意味ですか

  • 2つの文字列の数値を加算する、または
  • 2つの文字列を連結します

2番目と想定しますが、文字列を除くすべてのケースで、数値の加算にプラス記号が使用されます。どうして?

また、緩く型付けされた観点(PHP is is))から見ると、phpスクリプト

$myvar = 1;
$myvar2 = 2;

// would we expect a concatenation or addition?
$concat = $myvar + $myvar2;

したがって、ドット表記は、連結に使用されることを明確に示しています。

それは混乱するということではなく、他のすべての言語が異なる方法で行うので直感的ではないということです。そして、これはトレンドに従うのに良い理由ですか?いつもそうであるように物事を行うことは、常に正しい方法であるとは限りません。

30
Codemwnci

プラス記号は、文字列を連結するために想像するほど広く受け入れられていません。 PerlやCを含むlotを使用しない言語があり、これらはPHPのルーツがある場所であるため、PHP多くの言語には演算子がなく、concat()関数を使用する必要があります。

PHPは弱く型付けされており、プラス記号またはドットを検出すると暗黙の型変換を行います。つまり、$x = "45 inches" + "20 inches";、PHPが設定されます$x65。ドット連結演算子を使用すると、結果は明らかに大きく異なります。同じことが$y = 5 . 10;。これは510、しかしそれをプラス記号に変更すると、完全に異なる結果が得られます。

また、論理的に考えると、プラスの反対はマイナスです。しかし、それは簡単に連結に対応することはできません。 (私はそれを試した1つの言語を見ましたが、それは本当にあまり意味がありませんでした)

連結記号としてのプラス記号の好みは、新しい言語を学習するときに変更への抵抗に純粋に下ります(かなり一般的なことです-私は最初は嫌だったPythonブレース!)

多くの言語を使用して長い間プログラミングを行ってきた人として、明確な連結演算子を使用するほうがずっと好きだと言えるでしょう。緩やかに型付けされた言語での加算と連結に同じ演算子を使用すると、問題が生じます。実際、これはJavascriptの最大の欠陥の1つだと思います(これは、一般にJavascriptのファンである人からのものです)。

Pythonはstronly型です。つまり、同じ型で作業することを強制するため、加算および連結演算子としてプラス記号を使用する必要がなくなります。 Pythonでは文字列に整数を追加できません。必要な場合は、型を明示的にキャストする必要があります。そのため、少なくともコンパイラに対して、あいまいさはありません。

ただし、それでも読者にはあいまいさが残ります。コード内のプラス記号の意味を読んでもすぐには分からない場合があります。 Pythonで計算する方が簡単ですが、個人的には、あいまいでない演算子を使用したいのですが、それは個人的な好みにすぎません。Python、Javascript、またはVisualで作業している場合基本、それから私は彼らのルールに従う必要があります。

10
Spudley

+をPHPの連結演算子として使用することはできません。数字と数字の文字列が等価であるためです。同じ記号を使用する2つの演算子があり、"3" + 3からの結果は未定義でなければなりません。現在、"3" + 36であり、"3" . 3"33"です。

6
Rosh Oxymoron