Почему точка ".", а не символ плюс "+" для объединения строк в PHP?


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

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

Author: Daniel May, 2009-12-08

12 answers

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

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

 24
Author: Daniel May, 2013-10-08 12:19:51

Синтаксис PHP зависит от Perl, и . является оператором объединения строк в Perl.

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

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

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

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

 35
Author: Ben James, 2009-12-08 15:00:26

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

$first  = 100;
$second = 20;
$stringresult     = $first . $second; // "10020"
$arithmeticresult = $first + $second; // 120
 21
Author: Paul Hsieh, 2017-02-01 00:21:45

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

 13
Author: Sarfraz, 2010-02-18 05:06:35

Дуглас Крокфорд считает, что +для объединения - плохая идея:

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

 8
Author: Skilldrick, 2009-12-08 17:37:19

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

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

 7
Author: Joey, 2009-12-08 10:40:04

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

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

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

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

 5
Author: mauris, 2009-12-08 10:38:20

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

Из Руководства по 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
Author: o.k.w, 2009-12-08 10:42:57

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

 2
Author: fbrereto, 2009-12-08 17:10:48

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

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

         "5"  ==   5
    "5" + 5   ==  10
    "5" . 5   ==  55
    
  • Чтобы определить разницу между сложением и объединением, они должны были быть двумя разными операторами.
  • Perl скопировал оператор доступа к методу из C ->.
  • Это было до многих более современные языки программирования начали использовать . для доступа к методам.
  • Объединение является одной из наиболее распространенных операций и должно использовать меньше символов. Согласно кодировке Хаффмана.
  • . был одним из немногих символов, доступных для этого использования. Единственный другой, который имеет смысл использовать, - это ~, вероятно, поэтому теперь это оператор конкатенации Perl 6.
 2
Author: Brad Gilbert, 2009-12-09 16:43:44

Хотя это не историческая причина, это, возможно, покажет вам, почему хорошо иметь отдельный оператор для сложения и объединения в случае 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, но вместо того, чтобы явно отмечать преобразование типов, мы помечаем оператором то, как мы видим переменные в терминах типов.

 1
Author: totymedli, 2015-09-23 17:09:49

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

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

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

 0
Author: Gazler, 2009-12-08 10:40:30