Почему оператор конкатенации строк в PHP представляет собой точку (.)?

В PHP строковый оператор точка (.) используется для конкатенации струны. Например:

$msg = "Hello there, " . $yourName;

Кажется, что оператор точки всегда сбивает с толку людей (включая меня) в первый раз, когда они его видят, тем более что, когда вы используете его для объединения двух строк, операция не выдает ошибку, а просто молча терпит неудачу. Это также распространенная ошибка при переключении между PHP и другими языками, такими как JavaScript, Python и т. д., которые не используют этот оператор.

Почему в языке используется оператор точки (.) вместо более широко распространенного оператора, такого как плюс (+)? Есть ли какие-либо исторические причины, на которые вы можете указать, почему был выбран этот оператор? Это только потому, что точка может преобразовывать другие типы переменных в строку? Например:

echo 1 . 2;                // Prints the string "12"

person Justin Ethier    schedule 24.11.2010    source источник
comment
Использование + не было бы особенно практичным в языке со слабой типизацией: должно выводиться 1 + 2; дать 12 или 3?   -  person Mark Baker    schedule 24.11.2010
comment
Это только потому, что точка может преобразовывать другие типы переменных в строку? Как и все, что ожидает строкового приведения примитивного типа к строкам: Да, в этом причина ;)   -  person KingCrunch    schedule 24.11.2010
comment
Мне бы очень понравился оператор + для конкатенации строк в PHP, оператор . только сбивает с толку, и это одна из немногих вещей, которые я больше всего ненавижу в PHP.   -  person Marco Demaio    schedule 02.12.2012
comment
Чем это не рынок, как неконструктивно?   -  person umassthrower    schedule 26.03.2013
comment
Вопросы по программированию без конкретных ответов лучше подходят на programmers.stackexchange.com   -  person Cees Timmerman    schedule 20.11.2013
comment
По состоянию на 2017 год эту ветку просмотрели 16 000 человек — чем это неконструктивно?   -  person duhaime    schedule 02.12.2017
comment
В ответах здесь отсутствует фактическая причина, по которой PHP использует файлы . для конкатенации: потому что он заимствовал его из Perl. Первоначально PHP был набором сценариев Perl и заимствовал ряд вещей из синтаксиса Perl. Почему Perl использует . для конкатенации, я не знаю :)   -  person Alice Heaton    schedule 02.12.2020
comment
Дубликат (задан годом ранее, с 15 ответами): Почему точка, "." а не плюс, «+», для конкатенации строк в PHP?   -  person Peter Mortensen    schedule 16.05.2021


Ответы (3)


Я думаю, что это хорошая идея иметь другого оператора, потому что точка и плюс делают совершенно разные вещи.

Что на самом деле означает "a string" + "another string"; с точки зрения неспецифического языка?

Значит ли это

  • Добавьте числовое значение двух строк или,
  • объединить две строки

Вы могли бы предположить, что это второе, но знак плюс используется для числового сложения во всех случаях, кроме строк. Почему?

Кроме того, со слабо типизированной точки зрения (которой является PHP), php-скрипт

$myvar = 1;
$myvar2 = 2;

// would we expect a concatenation or addition?
$concat = $myvar + $myvar2;

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

Дело не в том, что это сбивает с толку, а в том, что это не интуитивно понятно, потому что все другие языки делают это по-другому. И это хороший повод следовать тренду? Делать вещи так, как они всегда делаются, не всегда правильно.

person Codemwnci    schedule 24.11.2010
comment
Я ценю ваши логические доводы, но я совершенно не согласен. Точка просто сбивает с толку, и это одна из немногих вещей, которые я действительно ненавижу в PHP. - person Marco Demaio; 02.12.2012
comment
Почему это просто сбивает с толку? Ваш комментарий выше, похоже, подразумевает не что иное, как личное предпочтение оператора + (которое, как я подозреваю, исходит из вашего опыта работы с другими языками, которые его используют?). - person traq; 03.01.2013
comment
Я думаю, что это, по крайней мере, немного немного сбивает с толку, что 1 . 2 не равно 1.2. А кто-то с математическим образованием может подумать, что $x . $y означает $x, умноженное на $y. (Но очевидно, что любой, кто начинает программировать на новом языке, должен изучить основные операторы для этого языка.) - person nnnnnn; 20.05.2013
comment
Аргумент веский, но предпосылка неверна. PHP создает неоднозначность, которую решают операторы точки, из-за своей слабой системы типов. Это компромисс между более строгими типами переменных и более строгими типами аргументов операций: в JavaScript + обычно недвусмыслен, потому что вы должны преобразовать пользовательский ввод в правильный тип перед его использованием; в PHP + необходимо применять свои типы аргументов (т. е. автоматически преобразовывать свои аргументы в числа), потому что ожидается, что вы сможете просто передавать пользовательский ввод в виде строк. Это одна из причин, почему многие считают PHP небрежным. - person Alan Plum; 13.09.2014

Знак "плюс" не так "широко принят" для объединения строк, как вы могли себе представить. Существует множество языков, в которых он не используется, включая Perl и C, и, поскольку именно в них лежат корни PHP, PHP имеет смысл последовать их примеру. Во многих языках для этого даже нет оператора; вам придется использовать функцию concat().

PHP имеет слабую типизацию и будет выполнять неявное преобразование типов, когда увидит знак плюс или точку. Это означает, что если вы сделаете $x = "45 inches" + "20 inches";, PHP установит $x в 65. Если вы используете оператор конкатенации точек, результат явно будет сильно отличаться. То же самое относится, если у вас есть $y = 5 . 10;. Это даст вам 510, но измените его на знак плюс, и вы получите совершенно другой результат.

Кроме того, рассуждая логически, противоположность плюса – это минус. Но это не так легко сопоставляется с конкатенацией. (Я видел один язык, который пытался это сделать, но на самом деле это не имело особого смысла)

Ваше предпочтение знаку «плюс» в качестве конкатенатора обусловлено исключительно сопротивлением изменениям при изучении нового языка (довольно распространенное явление — я знаю нескольких человек, которые изначально ненавидели Python из-за отсутствия фигурных скобок!)

Как человек, который долгое время программировал на многих языках, я могу сказать вам, что предпочитаю однозначный оператор конкатенации. Использование одного и того же оператора для сложения и конкатенации в свободно типизированном языке вызывает проблемы; на самом деле, я бы сказал, что это один из самых больших недостатков Javascript (и это исходит от кого-то, кто в целом является поклонником Javascript).

Python строго типизирован, что означает, что ему может сойти с рук использование знака плюс в качестве оператора сложения и конкатенации, потому что это заставляет вас работать с одним и тем же типом; вы не можете добавить целое число к строке в Python; если вам нужно, вы должны явно указать свои типы, чтобы не было двусмысленности, по крайней мере, не для компилятора.

Однако для читателя все еще существует двусмысленность - при чтении может быть не сразу очевидно, что имелось в виду под любым данным плюсом в коде. В Python это сделать проще, но лично я все же предпочел бы иметь однозначный оператор. Но это всего лишь личное предпочтение; если я работаю с Python, Javascript или Visual Basic, то я должен работать по их правилам.

person Spudley    schedule 24.11.2010
comment
Язык C не использует оператор +, потому что в нем вообще нет оператора конкатенации строк! Вы можете перегружать операторы класса только в C++, и я до сих пор помню, что одной из первых вещей, которые я сделал, изучая C++, был класс MyString с оператором +, используемым для конкатенации строк. Это было круто! - person Marco Demaio; 02.12.2012

Невозможно использовать + в качестве оператора конкатенации в PHP из-за эквивалентности между строками цифр и цифр. У вас было бы два оператора, использующих один и тот же символ, и результат от "3" + 3 должен был бы быть неопределенным. Теперь "3" + 3 это 6, а "3" . 3 это "33".

person Rosh Oxymoron    schedule 24.11.2010
comment
3 + 3 должно быть неопределенным. - Оно не должно быть неопределенным, его можно просто преобразовать в строку, как это делают многие другие языки, не распутывая очень ткань времени и пространства. - person nnnnnn; 20.05.2013