views:

1274

answers:

11

Why did the designers of PHP decide to use a full stop / period / "." as the string concatenation operator rather than the more usual plus symbol "+" ?

Is there any advantage to it, or any reason at all? Or did they just like to? :o)

+5  A: 

I would too prefer to use a full stop instead of a plus sign because I usually associate + with mathematical equations.

For Example "this is a string " + 56 + 20

This would be very confusing for both the compiler/interpreter and the developer.

However the disadvantage to using full stop for concatenation operator is that it is just a dot on the screen and sometimes you can't see whether is it in the string or outside the string.

thephpdeveloper
Confusing if you are not used to it. In Java and C# this is the norm.
RichardOD
yeah i know. in Java i had to do this instead: `"this is a string " + (56 + 20)`
thephpdeveloper
Being "used to it" has nothing to do with it. I've been writing C# for a couple years, and before that Java since around 1999, and this ambiguous crap still confuses me. (In comparison, Haskell's string concatenation operator took me about 10 seconds to figure out.) Examples of crappy syntax are like assholes: every language has one and they all stink.
Ken
+29  A: 

PHP's syntax is influenced by Perl, and . is the string concatenation operator in Perl.

In a weakly typed language there are advantages to having a different string concatenation and numeric addition operators: which one you use will influence which type the language coerces the variables to.

As it happens, Perl 6 will use a tilde ~ instead of a dot . for string concatenation, because . will be used for object member access. So it seems the designers of Perl now think it was a bad choice.

Perhaps, in Perl and PHP's early, non-Object-Oriented days, it seemed like as good a choice as any. Maybe the designers of both languages never envisaged them becoming strong OO languages.

As for whether PHP will one day ditch its -> member access syntax for ., who knows?

Ben James
Doesn't really answer the question "why the use of a period". It just defers the answer.
joshcomley
joshcomley: that was a valid point, so I have elaborated. Initially I took the reference to "the designers of PHP" at face value
Ben James
Actaully Perl 6 now uses the "~" for string concatentaion.
mpeters
mpeters: Thanks, it seems I was behind on this news, I have edited accordingly.
Ben James
The de facto standardization on "." as the method operator post dates the adoption of "." for concatenation in Perl which then influenced PHP. And perl initially had no object orientation.It is precisely because everyone now expects "." to indicate methods on objects that Perl 6 has adopted new syntax (from a perl point of view) allowing "." to be used for methods and using "~" for concatenation.
Alex Stoddard
It's not so much that they thought it was a bad choice, as it was that the . operator has become the defacto method accessor in almost all languages. Back then, it was a fine choice. Now they want to use it for a different purpose.
Robert P
Robert P: That's exactly the point I tried to make.
Ben James
Because if you used + for concatenation, like in Javascript, you run into typing issues due to loosely typed languages. The lexical parser has a hard time determining whether you want to do addition or concatenation.
cballou
+7  A: 

The use of the dot as string concatenation operator in PHP probably dates back to Perl. Remember that PHP once was nothing more than a bunch of Perl scripts.

Also it makes sense to have distinct string concatenation and addition operators, especially in weakly-typed languages. There are enough pitfalls in PHP already to shoot yourself in the foot, you don't need to add another one.

Joey
A: 

I guess it is so you can concatenate numbers with strings?

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

Since you don't declare variable types, with a + it could give a result of 100 instead of "hello100."

Gazler
+13  A: 

Logically + is used for numbers. While a dot is used to concatenate two sentences (strings) in a paragraph for example. Hence dot is used to concatenate strings. So it is pretty logical i believe. It is better that way...

Sarfraz
Interesting analogy
pavium
How often do you use string concatenation to concatenate sentences? Also, dot is a sentence _terminator_, not a sentence _separator_, so analogy breaks anyway.
Pavel Minaev
Analogy is imperfect, film at 11.
Ken
Why do you put a dot in-between sentences? You should not include one i suppose :)
Sarfraz
+5  A: 

This doesn't answer the question, just wanted to share something.

From PHP Manual: String Operators, someone posted this which I find rather interesting. Notice how the space plays a part in the output.

Excerpt:
If you attempt to add numbers with a concatenation operator, your result will be the result of those numbers as strings.

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

?>
o.k.w
+18  A: 

I am not a PHP expert, but, how else do you do differentiate that last two lines?

$first  = 100;
$second = 20;
$stringresult     = $first . $second;
$arithmeticresult = $first + $second;
Paul Hsieh
For clarity - `$stringresult` returns "10020" and `$arithmeticresult` returns `120`.
Daniel May
Pavel Minaev
Paul Hsieh
@Pavel: Why is `.` not a "sane operator" for concatenation? And just because you're used to using `.` for object members doesn't make it the most logical operator for that. (PHP's choice of `->` is quite good IMO.)
DisgruntledGoat
`->` isn't attrocious, but the most common use of that operator is in C++ as a shorthand to dereference pointers to objects or structs. Say there's a `struct` with a member `x` and you have a pointer `p` to a struct of that type. Rather than using `(*p).x = 5;`, you would use `p->x = 5;`. Given PHP's C-like lineage, I think this overloads the syntax, even if there's no use for that operator in this context in PHP.
Andrew Noyes
@Andrew - No. PHP inherits teh `->` syntax from Perl. In Perl, to dereference a hash reference, you use `my $hash = { this => "that" }; $hash->{this}`. It is conceptually performing a "dereference and then access", which is the same thing it does in C.
Chris Lutz
+14  A: 

The most obvious reason would probably be that PHP inherits a lot of its syntax from Perl - and Perl uses a dot (.) for string concatenation.

But, we can delve deeper into it and figure out why this was implemented in Perl - the + operator is most commonly used for mathematical equations - it's only used for concatenation in languages in which the variable type can define the way in which the operator works (simple explanation, example is C#)

var intAddition = 1 + 2;
Console.WriteLine(intAddition); // Prints 3
var stringConcat = "1" + "2";
Console.WriteLine(stringConcat); // Prints "12"

^ As you can see, the + operator is used both for concatenation and addition in C#.


Perhaps the reasoning goes lower level and is due to the boolean algebra of logic gates - + means OR in logic gates, whereas . is used as the AND operator - which makes sense when it comes to string concatenation.

It makes sense to have two separate operators, one for concatenation and one for addition - it's just unfortunate that these two can be mixed up due to other languages.

Daniel May
+2  A: 

Here is a bit of historical context.

  • The PHP language started out as a set of Perl scripts.
  • As such, PHP gets most of it's syntax from Perl.
  • Perl, and by extension PHP, has untyped variables.

         "5"  ==   5
    "5" + 5   ==  10
    "5" . 5   ==  55
    
  • To be able to tell the difference between addition and concatenation, they had to be two different operators.
  • Perl copied the method access operator from C ->.
  • This was before many of the more modern programming languages started to use . for method access.
  • Concatenation is one of the more common operations, and should use fewer characters. According to Huffman coding.
  • . was one of the few characters available for this use. The only other one that would make sense to use is ~, which is probably why that is now the Perl 6 concatenation operator.
Brad Gilbert
Not sure where you've got Perl Home Page from, but in 12 yrs of PHP development, I've never heard it called this: "Personal Home Page Tools" maybe
iAn
Oh and it currently stands for "PHP Hypertext Preprocessor"
iAn
Grr at "untyped variables". That's an oversimplification.
Sean McMillan
Perl Home Page Tools is right. In the german version of the wikipedia article it is mentioned right in the first sentence: http://de.wikipedia.org/wiki/PHP
Hippo
I'm sure that I read that it was called Perl Home Page, sometime **before** it was released. That could just my mind playing tricks on me though. At any rate, I removed that item from the list, because this post seemed better without it.
Brad Gilbert
+2  A: 

+ should always be defined as a commutative operation (i.e., A+B = B+A). In the case of string concatenation, this is not the case ("foo" + "bar" != "bar" + "foo"). As such, + is not a good operator to use for the concatenation operation. Whether or not the language authors had this in mind when they used . instead (which is close to the multiplication operator, for which commutativity need not hold) remains to be seen, but it was a good decision nonetheless.

fbrereto
Even in math, addition is not always commutative; e.g. not for ordinal numbers.
Pavel Minaev
@Pavel: huh? I've never heard of anyone *trying* to add ordinals. How does First + Second even compute? Is the answer Third? If so, why wouldn't Second + First also equal Third?
jimtut
http://en.wikipedia.org/wiki/Ordinal_number
Pavel Minaev
+7  A: 

Douglas Crockford thinks that + for Concatenation is a Bad Idea:

JavaScript has its share of design errors, such as the overloading of + to mean both addition and concatenation with type coercion

Skilldrick
I agree with Doug. Once you get used to the syntax it's much clearer and less ambiguous - both worthwhile aims for syntax.
Skilldrick
Yeah; Javascript + wrecks my brain on a regular basis, usually because it starts concatenating when I didn't want it to.
Sean McMillan
+ for concatenation is one of the few things that regularly catches me out in JS
Ben James