web-dev-qa-db-ja.com

なぜ終止符、「。」 PHPでの文字列連結のプラス記号「+」ではありませんか?

PHPの設計者が、通常のプラス記号 "+"ではなく、文字列連結演算子としてピリオド/ピリオド/ "。"を使用することにしたのはなぜですか?

それには何か利点がありますか、それとも何らかの理由がありますか?それとも彼らはただ好きでしたか? :o)

34
Caroline

最も明白な理由はおそらくPHPはPerlからその構文の多くを継承します-そしてPerlは文字列にドット(.)を使用します連結。

しかし、それをさらに深く掘り下げて、これがPerlで実装された理由を理解することができます-+演算子は数式に最も一般的に使用されます-変数タイプが方法を定義できる言語での連結にのみ使用されますオペレーターが機能するもの(簡単な説明、例はC#)

var intAddition = 1 + 2;
Console.WriteLine(intAddition); // Prints 3
var stringConcat = "1" + "2";
Console.WriteLine(stringConcat); // Prints "12"

^ご覧のとおり、+演算子は、C#での連結と加算の両方に使用されます。


おそらく、推論はより低いレベルになり、 論理ゲート --+は論理ゲートでORを意味し、.は論理ゲートとして使用されるブール代数によるものです。 AND演算子-文字列の連結に関しては意味があります。

1つは連結用、もう1つは加算用の、2つの別個の演算子を使用することは理にかなっています。他の言語が原因で、これら2つが混同される可能性があるのは残念です。

24
Daniel May

PHPの構文はPerlの影響を受けており、.はPerlの文字列連結演算子です。

弱い型の言語では、異なる文字列連結演算子と数値加算演算子を使用することには利点があります。どちらを使用するかによって、言語が変数を強制する型に影響します。

たまたま、Perl6は文字列の連結にドット~の代わりにチルダ.を使用します。これは、.がオブジェクトメンバーのアクセスに使用されるためです。したがって、Perlの設計者は今ではそれが悪い選択だったと考えているようです。

おそらく、PerlとPHPの初期の、オブジェクト指向ではない時代には、それは他の選択肢と同じくらい良い選択のように思えました。たぶん、両方の言語の設計者は、彼らが強くなることを想像していなかったOO言語。

PHPいつの日か、->のメンバーアクセス構文を.に捨てるかどうかについては、誰が知っていますか?

35
Ben James

私はPHPの専門家ではありませんが、最後の2行を他にどのように区別しますか?

$first  = 100;
$second = 20;
$stringresult     = $first . $second; // "10020"
$arithmeticresult = $first + $second; // 120
21
Paul Hsieh

論理的に+は数値に使用されます。 dotは、たとえば段落内の2つの文(文字列)を連結するために使用されます。したがって、ドットは文字列を連結するために使用されます。だからそれは私が信じているかなり論理的です。その方がいいです...

13
Sarfraz

Douglas Crockfordは、+ for Concatenationは悪い考えだと考えています

JavaScriptには、型強制による加算と連結の両方を意味する+のオーバーロードなど、設計エラーのシェアがあります。

8
Skilldrick

PHPでの文字列連結演算子としてのドットの使用は、おそらくPerlにまでさかのぼります。PHPかつては、Perlスクリプトの束にすぎなかったことを忘れないでください。

また、特に弱い型の言語では、明確な文字列の連結演算子と加算演算子を使用することも理にかなっています。 PHPにはすでに足を撃つための十分な落とし穴があります。別の落とし穴を追加する必要はありませんが、.

7
Joey

私は通常、+を数式に関連付けるため、プラス記号の代わりにピリオドを使用することを好みます。

例えば ​​"this is a string " + 56 + 20

これは、コンパイラ/インタプリタと開発者の両方にとって非常に混乱します。

ただし、連結演算子にピリオドを使用することの欠点は、画面上のドットであり、文字列内にあるのか文字列外にあるのかがわからない場合があることです。

5
mauris

これは質問に答えません、ただ何かを共有したかっただけです。

PHPマニュアル:文字列演算子 から、誰かがこれを投稿しましたが、私はかなり興味深いと思います。スペースが出力でどのように機能するかに注目してください。

抜粋:
連結演算子を使用して数値を追加しようとすると、結果はそれらの数値を文字列として結果になります。

<?php

echo "thr"."ee";           //prints the string "three"
echo "twe" . "lve";        //prints the string "twelve"
echo 1 . 2;                //prints the string "12"
echo 1.2;                  //prints the number 1.2
echo 1+2;                  //prints the number 3

?>
5
o.k.w

ここに少し歴史的な文脈があります。

  • PHP言語は、Perlスクリプトのセットとして始まりました。
  • そのため、PHPは、その構文のほとんどをPerlから取得します。
  • Perl、ひいてはPHPには、型なし変数があります。

         "5"  ==   5
    "5" + 5   ==  10
    "5" . 5   ==  55
    
  • 加算と連結の違いを区別できるようにするには、2つの異なる演算子である必要がありました。
  • Perlは、C ->からメソッドアクセス演算子をコピーしました。
  • これは以前より現代的なプログラミング言語の多くがメソッドアクセスに.を使用し始めました。
  • 連結は、最も一般的な操作の1つであり、使用する文字数を減らす必要があります。ハフマン符号化によると。
  • .は、この用途に使用できる数少ない文字の1つでした。使用するのが理にかなっている他の唯一のものは~です。これが、おそらくそれが現在Perl6連結演算子である理由です。
2
Brad Gilbert

+は、常に可換演算として定義する必要があります(つまり、A + B = B + A)。文字列連結の場合、これは当てはまりません( "foo" + "bar"!= "bar" + "foo")。そのため、+は連結操作に使用するのに適した演算子ではありません。言語の作者が代わりに.を使用したときにこれを念頭に置いていたかどうか(可換性が保持される必要のない乗算演算子に近い)はまだわかりませんが、それでもそれは良い決断でした。

2
fbrereto

これは歴史的な理由ではありませんが、PHPの場合、加算と連結のために別個の演算子を使用することがなぜ良いのかを示しているかもしれません。

その理由は、JavaScriptで見られるものです。連結と加算にも_+_文字を使用します。 PHPには、2つの演算子があります。これは、暗黙的な型変換も存在する動的に型指定された言語にとって重要です。

PHPの場合

_echo  5  + 1; //6
echo  5  . 1; //51
echo "5" + 1; //6
echo "5" . 1; //51
_

2つの変数を追加するか連結するかを常に明示的に示しているため、これは誰にとっても驚くべきことではありません。言い換えれば、それらを数字または文字列として考える場合です。

JavaScriptの場合

_console.log( 5  +  1);  //6
console.log("5" +  1);  //51
console.log( 5  + "1"); //51
console.log("5" + "1"); //51
_

暗黙の型変換が内部でどのように行われるかについての知識がないと、多くの場合(特に複雑な場合)、結果がどうなるかわからないため、驚くべき結果が生じる可能性があります。

Pythonの場合

Pythonは、連結と加算にも_+_演算子を使用しますが、暗黙的な型変換は行われません。型変換を明示的にマークする必要があります。

_print  5  + 1 //6
print "5" + 1 //TypeError: cannot concatenate 'str' and 'int' objects
_

それを機能させるには、型変換を行う必要があります:a + int(b)

概して

考えてみると、PHP Python)でもほぼ同じことが起こることがわかりますが、型変換を明示的にマークする代わりに、型の観点から変数をどのように見るかを演算子でマークします。

1
totymedli

数字と文字列を連結できるようにするためだと思いますか?

$i=100;
$str="hello";
$str2 = $str.$i

変数タイプを宣言しないため、+を使用すると、「hello100」ではなく100の結果が得られる可能性があります。

0
Gazler