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

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

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

12 ответов


наиболее очевидной причиной, вероятно, будет то, что PHP наследует много своего синтаксиса от Perl - и Perl использует точку (.) для конкатенации строк.

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

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


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

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

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


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

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


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

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


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

"this is a string " + 56 + 20

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

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


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

С руководство 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

?>

+ всегда следует определять как коммутативную операцию (т. е. 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 оператор.

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


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

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

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