🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

3104閲覧

【PHP】文字列のドット演算子について教えて下さい。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/10/13 06:48

PHPの全くの初心者で初歩的な質問になり、お恥ずかしい限りですが教えて下さい。

PHP

1$string = '123' . '456' . '789'; // 正しいコード 2$string = '123' + '456' + '789'; // 間違ったコード

PHPでは「.」を文字列の結合演算子として使っていますが、
普通、大半の言語で「.」演算子はインスタンスメソッドや変数を表すのに使い、
C言語ですら構造体のメンバー変数を表すのに使います。

元々の思想で初めから「+」演算子は数値しか考えなかったのでしょうが、
C言語などとは違うスクリプト言語ですから、少なくとも「.」を文字列結合演算子などという
単純な表現に使う発想はあり得ない気がしています。

似たようなことは、配列の要素追加にも言えて、

PHP

1$array = []; 2for ($i = 0, $value = 1; $i < 10; $i++, $value++) { 3 $array[] = $value; // 正しいコード 4 $array[] += $value; // 間違ったコード 5}

と代入演算子で賄っていますが、正しいコードの方では上書きのイメージしか湧きません。

そういう言語仕様ですから反論するつもりはなく、
そういう言語仕様になったわけが知りたいです。

ご存知の方がいらっしゃれば教えていただけると有難いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

完全な余談w

混ぜるな危険を混ぜたときの挙動が、暴れん坊な PHP 7.4 以降で変わります。
PHP RFC: Change the precedence of the concatenation operator

php

1// ~7.3 2echo "3" . "5" + 7; // 42 3// 7.4~ 4echo "3" . "5" + 7; // “312”

投稿2019/10/13 12:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/10/13 12:31

演算子の優先順位を変えるってものすごく影響が大きいと思うんですが、それだけのメリットあるんでしょうか、これ。
kyoya0819

2019/10/13 12:37

すごいめんどくさいですね... 忘れないようにメモメモっと,,,
退会済みユーザー

退会済みユーザー

2019/10/13 12:38

rana_kualu さんのまとめの方も貼っときますね。 https://qiita.com/rana_kualu/items/db7ae541016bd0b02122 OSS 漁って影響度合いを調べた人がいるらしいですw 直感的には正しくなるし、そうでないものは元々カッコが付いてるんで大丈夫でしょ。って判断みたいですね。
Zuishin

2019/10/13 12:50

三項演算子の問題もあるし、とにかくカッコつけまくったほうがいいということですね。
退会済みユーザー

退会済みユーザー

2019/10/13 12:53

あーあれもやばいですねw まぁリーダブルにしとけって話で良いかと。 正直サンプル見ても一瞬何書いてあるのかわからんかったw
guest

0

すでにある回答と重なりますが、PHPの元になっているPerlは、数値と、数値を表す文字列を区別して扱いたくなかったということでしょう。等値比較の演算子も、「数値としての比較」と「文字列としての比較」で異なります。("0"=="00"は真で、"0" eq "00"は偽)

Perl以前よりあるスクリプト言語としてはAwkがありますが、これも数値と、数値を表す文字列を区別しません。
Perlのもとになっているシェルスクリプトでは、値は文字列しかなく、数値を表す文字列を数値演算したい場合は外部コマンドを使うか、特別な構文が必要です。

投稿2019/10/13 11:31

otn

総合スコア85882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/13 12:59

コメントをいただきありがとうございます! PHPがPerlを元にしたものである以上、そうした解釈を受け継ぐのは止むを得ないんでしょうね。 とはいえ、やはりドット演算子はC言語ですら構造体のメンバー変数を表す記号ですから、 ドットを文字列の結合演算子として使っていること自体に違和感が覚えてしまいます。 まあ初心者レベルでの感触ですが。
otn

2019/10/13 13:10

私はPerlやPHPを常用しないことで、違和感を回避しています。
guest

0

参考元

The plus sign is not as "widely accepted" as you would imagine for concatenating strings. There are a lot of languages which don't use it, including Perl and C, and since these are which are where PHP's roots lie, it makes sense for PHP to follow suit. Many languages don't even have an operator for it; you'd have to use a concat() function.

PHP is weakly typed, and will do implicit type conversion when it sees the plus sign or a dot. This means that if you do $x = "45 inches" + "20 inches";, PHP will set $x to 65. If you use the dot concatenation operator, the result will clearly be very different. The same applies if you have $y = 5 . 10;. This will give you 510, but change it to a plus sign and you get a completely different result.

Also, thinking logically, the opposite of a plus is a minus. But that doesn't map so easily to concatenation. (I have seen one language that tried it, but it really didn't make much sense)

Your preference for the plus sign as a concatenator is purely down to a resistance to change when learning a new language (quite a common thing - I know a few people who initially hated Python because it lacks curly braces!)

As someone who's programmed for a long time using a lot of languages, I can tell you that I much prefer to have an unambiguous concatenation operator. Using the same operator for addition and concatenation in a loosely-typed language is asking for trouble; in fact, I would say it's one of Javascript's biggest flaws (and this is coming from someone who in general is a fan of Javascript).

Python is stronly-typed, which means that it can get away with using the plus sign as the addition and concatenation operator because it forces you to work with the same type; you can't add an integer to a string in Python; if you need to then you have to explicitly cast your types, so there's no ambiguity, at least not to the compiler.

There is, however, still the ambiguity for the reader - it may not immediately be obvious from reading what was meant by any given plus sign in the code. It's easier in Python to work it out, but personally I'd still prefer to have an unambiguous operator. But that is just a personal preference; if I'm working with Python, Javascript or Visual Basic then I have to work to their rules.


Google翻訳

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

PHPは弱い型付けであり、プラス記号またはドットを検出すると暗黙的な型変換を行います。つまり、$ x = "45インチ" + "20インチ";を実行すると、PHPは$ xを65に設定します。ドット連結演算子を使用すると、結果は明らかに大きく異なります。 $ y = 5の場合も同様です。 10 ;.これにより510が得られますが、プラス記号に変更すると、まったく異なる結果が得られます。

また、論理的に考えると、プラスの反対はマイナスです。しかし、それは連結にそれほど簡単にマップしません。 (試してみた言語が1つありましたが、実際にはあまり意味がありませんでした)

連結子としてのプラス記号の好みは、純粋に新しい言語を学習するときの変更に対する抵抗にあります(かなり一般的なこと-中括弧がないためにPythonを最初に嫌っていた少数の人々を知っています!)

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

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

ただし、読者にはまだあいまいさがあります。コード内のプラス記号が意味するものを読んでもすぐには明らかではないかもしれません。 Pythonでは簡単に解決できますが、個人的には明確な演算子が必要です。しかし、それは個人的な好みです。 Python、Javascript、またはVisual Basicを使用している場合は、それらのルールに従って作業する必要があります。

投稿2019/10/13 07:03

編集2019/10/13 07:33
kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyoya0819

2019/10/13 07:06

自分自身「そういうものだ」と思っていたので知らなかったので海外のQ&Aサイトより引用させていただきました。
退会済みユーザー

退会済みユーザー

2019/10/13 07:51

ありがとうございます! 引用して頂いたサイトをGoogleが自動翻訳した内容を私的に若干修正して印象的だったのが、 PHPは弱い型付けであり、プラス記号またはドット記号を検出すると暗黙的な型変換を行う。 つまり、$x = "45 inches" + "20 inches"; を実行すると、$xに65を設定する。(驚きました!) ドット連結演算子を使うと結果は大きく異なり、$y = 5 . 10;を実行すると$yに510を設定する。 長い間多くの言語を使用してプログラミングしてきた者として私は明確な連結演算子を持つべき だと言える。緩やかに型付けされた言語で追加と連結に同じ演算子を使用すると問題が発生する。 実際、これはJavascriptの最大の欠陥の1つだと思う。(これも驚きました!) 追加(数学的な加算)と連結(文字列的な連結)を明確に分けたかったようですね。 ご紹介していただき、ありがとうございました!
guest

0

ベストアンサー

サーバーサイドで動いて HTML を作成して返す言語として、昔は Perl が盛んに使われていました。Perl もまたドット演算子で文字列を連結します。PHP は Perl の影響を強く受けているそうなので、おそらく由来はそこだと思います。

では Perl はなぜドット演算子を選んだのかと言うと、やはり演算対象が数値でなく文字列であることを明示したかったのだと思います。

Perl は読みにくい(ヘビーユーザーは読みにくく書くことが「できる」と主張している)言語として知られており、コードが短くなるよう様々な工夫がされていました。かなりアクロバティックな書き方も頻繁に目にすることができましたが、それを許しながらコードの文字数を減らすために算術演算とは別の記号を採用して処理の明確化をはかったのだと思います。

投稿2019/10/13 07:30

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/13 08:20

丁寧にご説明していただきありがとうございます! 私はPerlの経験はありませんが、確かに複雑なコーディングが迫られるようですね。 PHPがPerlの影響を強く受けてしまったのは当時の流れで止むを得ない面があるかもしれません。 ただやはりドット演算子はPerlから脱却するタイミングで変えてほしかったなと私には思えます。 「@」なり「_」なり「`」なり他の記号にして、ドットはオブジェクト指向ではないC言語でも すでにそうだったように、何らかのメンバー変数を指す、記号としてほしかったところです。
Zuishin

2019/10/13 08:27

Perl ではオブジェクト指向は後付けなので、それは時系列的にどうにもなりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問