Почему полная остановка «.», А не символ плюса, «+», для конкатенации строк в PHP?

Почему разработчики PHP решили использовать полную остановку / период / "." как оператор конкатенации строк, а не более обычный плюс символ «+»?

Есть ли у него какое-либо преимущество или вообще какая-либо причина? Или они просто хотели? : О)

Наиболее очевидной причиной может быть то, что 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 что имеет смысл, когда дело доходит до конкатенации строк.

Имеет смысл иметь два отдельных оператора: один для конкатенации и один для добавления – просто прискорбно, что эти два могут быть замешаны из-за других языков.

Синтаксис PHP зависит от Perl и . является оператором конкатенации строк в Perl.

В слабо типизированном языке есть преимущества иметь различные операции конкатенации строк и числовые сложения: какой из них вы используете, будет влиять на тип, к которому язык принуждает переменные.

Как это происходит, Perl 6 будет использовать тильду ~ вместо точки . для конкатенации строк, потому что . будет использоваться для доступа к объекту. Поэтому, кажется, дизайнеры Perl теперь считают, что это был плохой выбор.

Возможно, в ранних, не-объектно-ориентированных днях Perl и PHP это казалось хорошим выбором, как любой. Возможно, дизайнеры обоих языков никогда не предполагали, что они становятся сильными OO-языками.

Что касается того, будет ли PHP однажды пропустить свой синтаксис доступа -> член . , кто знает?

Я не эксперт по PHP, но как вы еще различаете две последние строки?

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

Логически + используется для чисел. Хотя точка используется для конкатенации двух предложений (строк) в абзаце, например. Следовательно, точка используется для конкатенации строк. Так что это довольно логично, я верю. Так лучше …

Дуглас Крокфорд считает, что + для Concatenation – плохая идея :

JavaScript имеет свою долю ошибок проектирования, таких как перегрузка + для обозначения как добавления, так и конкатенации с типом принуждения

Использование точки в качестве оператора конкатенации строк в PHP, вероятно, относится к Perl. Помните, что PHP был всего лишь кучей скриптов Perl.

Также имеет смысл иметь различные операторы конкатенации и сложения строк, особенно на слабо типизированных языках. На PHP уже достаточно ловушек, чтобы стрелять в ногу, вам не нужно добавлять еще одну.

Я бы тоже предпочел использовать полную остановку вместо знака плюса, потому что я обычно связываю + с математическими уравнениями.

Например, "this is a string " + 56 + 20

Это было бы очень запутанным как для компилятора / интерпретатора, так и для разработчика.

Однако недостатком использования полной остановки для оператора конкатенации является то, что это всего лишь точка на экране, и иногда вы не можете увидеть, находится ли она в строке или вне строки.

Это не отвечает на вопрос, просто хотел поделиться чем-то.

Из руководства PHP: String Operators , кто-то разместил это, что я считаю довольно интересным. Обратите внимание, как пространство играет роль в выходе.

Выдержка:
Если вы попытаетесь добавить числа с помощью оператора конкатенации, ваш результат будет результатом этих чисел в виде строк.

 <?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 ?> 

+ всегда следует определять как коммутативную операцию (т. е. A + B = B + A). В случае конкатенации строк это не так («foo» + «bar»! = «Bar» + «foo»). Таким образом, + не является хорошим оператором для операции конкатенации. Независимо от того, знали ли авторы этого языка, когда они использовали это . вместо этого (что близко к оператору умножения, для которого нет необходимости в коммутативности) пока не видно, но это было хорошим решением.

Вот немного исторического контекста.

  • Язык PHP начинался как набор скриптов Perl.
  • Таким образом, PHP получает большую часть своего синтаксиса от Perl.
  • Perl, а также расширение PHP, имеет нетипизированные переменные.

      "5" == 5 "5" + 5 == 10 "5" . 5 == 55 
  • Чтобы иметь возможность сказать разницу между добавлением и конкатенацией, они должны были быть двумя разными операторами.
  • Perl скопировал оператор доступа метода из C -> .
  • Это было до того, как многие из более современных языков программирования начали использовать . для доступа к методу.
  • Конкатенация является одной из наиболее распространенных операций и должна использовать меньшее количество символов. Согласно кодировке Хаффмана.
  • . был одним из немногих символов, доступных для этого использования. Единственное, что имеет смысл использовать, – это ~ , что, вероятно, поэтому является теперь конкатенационным оператором Perl 6.

Я думаю, это так, что вы можете объединить числа со строками?

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

Поскольку вы не объявляете типы переменных, с + + он может дать результат 100 вместо «hello100».

Хотя это не историческая причина, это может показать вам, почему хорошо иметь отдельный оператор для добавления и конкатенации в случае PHP.

Причина в том, что мы видим в JavaScript. Мы также используем символ + для конкатенации и добавления. В PHP у нас есть отдельный оператор для двух, который важен для динамически типизированных языков, где также присутствует неявное преобразование типов.

В PHP

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

Это неудивительно для всех, потому что мы всегда четко указывали, хотим ли мы добавить или объединить две переменные. Или, другими словами, если мы думаем о них как о числах или о строках.

В 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, но вместо явной маркировки преобразования типов мы отмечаем с помощью оператора, что мы видим переменные в терминах типов.