Почему разработчики PHP решили использовать полную остановку/период/ "." как строка оператор конкатенации, а не более обычный плюс символ "+"?
Есть ли у него какое-либо преимущество или вообще какая-либо причина? Или они просто хотели?: О)
Почему разработчики PHP решили использовать полную остановку/период/ "." как строка оператор конкатенации, а не более обычный плюс символ "+"?
Есть ли у него какое-либо преимущество или вообще какая-либо причина? Или они просто хотели?: О)
Наиболее очевидной причиной может быть то, что PHP наследует много своего синтаксиса с Perl - и Perl использует точку (.
) для конкатенации строк.
Но мы можем углубиться в это и выяснить, почему это было реализовано в Perl - оператор +
наиболее часто используется для математических уравнений - он используется только для конкатенации на языках, где тип переменной может определять способ в котором работает оператор (простое объяснение, пример С#)
var intAddition = 1 + 2;
Console.WriteLine(intAddition); // Prints 3
var stringConcat = "1" + "2";
Console.WriteLine(stringConcat); // Prints "12"
^ Как вы можете видеть, оператор +
используется как для конкатенации, так и для добавления в С#.
Возможно, рассуждение идет на более низкий уровень и связано с булевой алгеброй логических ворот - +
означает 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: Операторы строк, кто-то разместил это, что я считаю довольно интересным. Обратите внимание, как пространство играет роль в выходе.
Выдержки:
Если вы попытаетесь добавить числа с помощью оператора конкатенации, ваш результат будет результатом этих чисел в виде строк.
<?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
?>
Вот немного исторического контекста.
Perl, а также расширение PHP, имеет нетипизированные переменные.
"5" == 5
"5" + 5 == 10
"5" . 5 == 55
->
..
для доступа к методу..
был одним из немногих символов, доступных для этого использования. Единственный другой, который имел бы смысл использовать, - это ~
, что, вероятно, поэтому является теперь оператором конкатенации Perl 6. +
всегда следует определять как коммутативную операцию (т.е. A + B = B + A). В случае конкатенации строк это не так ( "foo" + "bar"!= "Bar" + "foo" ). Таким образом, +
не является хорошим оператором для операции конкатенации. Независимо от того, знали ли авторы этого языка, когда они использовали .
(что близко к оператору умножения, для которого не требуется переносить), пока не видно, но это было хорошее решение тем не менее.
Хотя это не историческая причина, это может показать вам, почему хорошо иметь отдельный оператор для добавления и конкатенации в случае PHP.
Причина в том, что мы видим в JavaScript. Мы используем символ +
для конкатенации и добавления. В PHP у нас есть отдельный оператор для двух, который важен для динамически типизированных языков, где также присутствует неявное преобразование типов.
echo 5 + 1; //6
echo 5 . 1; //51
echo "5" + 1; //6
echo "5" . 1; //51
Это неудивительно для всех, потому что мы всегда четко указывали, хотим ли мы добавить или объединить две переменные. Или, другими словами, если мы думаем о них как о числах или о строках.
console.log( 5 + 1); //6
console.log("5" + 1); //51
console.log( 5 + "1"); //51
console.log("5" + "1"); //51
Без знания того, как неявные преобразования типов происходят под капотом, во многих случаях (особенно, если они сложны) могут произойти неожиданные результаты, потому что мы не знаем, каков будет результат, потому что это явно не указано.
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
Поскольку вы не объявляете типы переменных, с +, он может дать результат 100 вместо "hello100".