Difference between period and comma when concatenating with echo versus return?
Asked Answered
L

9

63

I just found that this will work:

echo $value , " continue";

but this does not:

return $value , " continue";

While . works instead of , in both the echo and return statements.

What is the difference between a period and a comma here?

Laurellaurella answered 23/9, 2009 at 14:36 Comment(0)
P
73

return only allows one expression, but echo allows a list of expressions where each expression is separated by a comma.

But note that since echo is not a function but a special language construct, wrapping the expression list in parenthesis is illegal.

Passion answered 23/9, 2009 at 14:40 Comment(3)
However echo does allow parentheses if there's only argument – Flanker
@JuanMendes it is not "echo". It's argument. Any expression can be wrapped in braces by design. $a = ("Hello world"); print_r(("hello ").("world")); etc. So it perfectly works with multiple arguments, echo (1), 2, (3); – Tartu
@YourCommonSense Way to make me and another eleven people feel dumb! But you're πŸ’―% right; the parentheses in echo("hello") are useless, as if I had used $someVar = ("test");. I got this example from What do parentheses around a variable do in PHP? – Flanker
G
43

You also have to note that echo as a construct is faster with commas than it is with dots.

So if you join a character 4 million times this is what you get:

echo $str1, $str2, $str3;

About 2.08 seconds

echo $str1 . $str2 . $str3;

About 3.48 seconds

It almost takes half the time as you can see above.

This is because PHP with dots joins the string first and then outputs them, while with commas just prints them out one after the other.

We are talking about fractions of a second, but still.

Original Source

Galileo answered 3/7, 2013 at 0:19 Comment(2)
i like your explanation. Its weird Ive been coding PHP for years and never knew you could comma seperate. Ive always used dots. – Hassiehassin
For a set of small strings (sum up to 1KB, which I believe fits pretty much all cases), using concatenation is ~5% faster; with 2.5KB there is a technical tie; with 5KB the difference reverses, with concatenation ~5% slower, and certainly from there the ideal is to use comma. – Rectal
D
20

The . is the concatenation operator in PHP, for putting two strings together.

The comma can be used for multiple inputs to echo.

Deland answered 23/9, 2009 at 14:38 Comment(5)
So comma is concatenation operator only for echo? – Laurellaurella
at that respect it's not a concatination, it's just a 'list' of variables or stings to echo... – Anaesthesiology
No, comma is creating a list of expressions for echo to use, echo concatenates the list when it prints it on one line. – Kneecap
But there is no bracket at all. – Laurellaurella
echo is not a function call, but a language construct. Language constructs in PHP can be called with or without parentheses. – Uncrowned
A
11

Dot (.) is for concatenation of a variable or string. This is why it works when you echo while concatenating two strings, and it works when you return a concatenation of a string in a method. But the comma doesn't concatenate and this is why the return statement won't work.

echo is a language construct that can take multiple expressions which is why the comma works:

void echo ( string $arg1  [, string $...  ] )

Use the dot for concatenation.

Acciaccatura answered 23/9, 2009 at 14:39 Comment(8)
But I'm using echo 'something',not echo('something') ,say,without brackets. – Laurellaurella
PHP supports the concept of variable functions. This means that if a variable name has parentheses appended to it, PHP will look for a function with the same name as whatever the variable evaluates to, and will attempt to execute it. Among other things, this can be used to implement callbacks, function tables, and so forth. – Acciaccatura
that's because echo is a keyword in PHP, in addition to being a function. you could write it as echo('something','something else') and it would also work fine. – Deland
Shore you should check the php.net website about echo. GSto and I are telling you exaclty what is written in the PHP documentation. And it works. – Acciaccatura
echo('something','something else') ; exit(); Parse error: syntax error, unexpected ',' – Laurellaurella
you cannot use parentheses when passing multiple parameters. Nobody uses it with parentheses anyway. – Flanker
The echo is a function - no it's not. See the answer below by @knittl – Divergent
@PatrickDesjardins, The echo is not a function. The echo is not a function. The echo is not a function. The echo is not a function. Read the docs, yes php.net/echo. "echo is not actually a function (it is a language construct), so you are not required to use parentheses with it. Additionally, if you want to pass more than one parameter to echo, the parameters must not be enclosed within parentheses.". And why do you say it works when all of us are getting "PHP Notice: Trying to get property of non-object in file.php on line 2"? – Expiation
B
7

echo is a language construct (not a function) and can take multiple arguments, that's why , works. using comma will be slightly even (but only some nanoseconds, nothing to worry about)

. is the concatenation operator (the glue) for strings

Bertero answered 23/9, 2009 at 14:43 Comment(0)
W
5

echo is actually a function (not really, but let's say it is for the sake of argument) that takes any number of parameters and will concatenate them together.

While return is not a function, but rather a keyword, that tells the function to return the value, and it is trying to interpret , as some kind of operator. You should be using . as the concatenation operator in the case when you are using the return statement.

Waldman answered 23/9, 2009 at 14:39 Comment(1)
Not a function. – Expiation
B
5

It's worth mentioning that the concatenation operator . has a higher precedence than lots of other operators and has equal precedence with + and - operators

Why is this important?

Well, talk is cheap let me show you the code ( from PHP documentation)

$x = 4;
// this line might result in unexpected output:
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// because it is evaluated like this line:
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// the desired precedence can be enforced by using parentheses:
echo "x minus one equals " . ($x-1) . ", or so I hope\n";

In fact, the first line will issue a deprecation message as of PHP 7.4.0

Deprecated: The behavior of unparenthesized expressions containing both '.' and '+'/'-' will change in PHP 8: '+'/'-' will take a higher precedence

So in PHP 8 it seems the problem of associativity in this case will be solved by giving + and - operators a higher precedence.

So can we say now that . and , when using echo give the same result?

No, they will not always give the same result

Let's take this case for example

echo ' Here\'s ' . $name ?? 'Johnny';

Here we used the Null coalescing operator so if $name exists and is not NULL it'll be returned otherwise it returns Johnny. At first glance, one may think the result will be Here's Johnny since $name is not defined or so they hope.

Actually the result will be

PHP Notice:  Undefined variable: name
Here's 

What happened here is that ?? operator has a lower precedence than the . which means PHP will try to evaluate (Here's $name) first.

You can solve this by either enclosing the expression in parentheses

echo ' Here\'s ' . ($name ?? 'Johnny');

Or simply use a comma.

echo ' Here\'s ' , $name ?? 'Johnny';
Bender answered 5/2, 2020 at 20:30 Comment(1)
So much valuable information in your comment! :) – Vela
P
0

In contrast with Mr.Web's answer PHP in 2022 is faster with the dots.

$ cat test.php 
<?php

$iterations = 10000;
$file_out ="./benchmark";
$precision = 8;

function dot()
{
        echo "Hello" . "World\n";
}

function comma()
{
        echo "Hello" , "World\n";
}

$begin = hrtime(true);
for ( $i=0 ; $i<$iterations; $i++) {
        dot();
}
$end = hrtime(true);
$out = "   dot: " . round($end-$begin, $precision)."\n";
file_put_contents($file_out, $out, FILE_APPEND);

$begin = hrtime(true);
for ( $i=0 ; $i<$iterations; $i++) {
        comma();
}
$end = hrtime(true);
$out = " comma: " . round($end-$begin, $precision)."\n";
file_put_contents($file_out, $out, FILE_APPEND);

$ php test.php
...snip...

$ cat benchmark 
   dot: 22893557
 comma: 29056406
Protozoal answered 30/6, 2022 at 12:44 Comment(0)
B
0

There is another interesting difference. Per @phirschybar's answer to this question, if you use commas in conjunction with html <pre> you get a result that maintains line breaks. This is useful for viewing a formatted object. For example, given this object:

$object = new stdClass();
$object->property = 'test value';

Using concatenation...

echo "<pre>" . var_dump($object) . "</pre>";

... you get no line breaks, making a large object difficult to read:

object(stdClass)#1 (1) { ["property"]=> string(10) "test value" }

But using commas...

echo "<pre>" , var_dump($object) , "</pre>";

... you get line breaks for easy reading:

object(stdClass)#1 (1) {
  ["property"]=>
  string(10) "test value"
}
Bezanson answered 23/8, 2022 at 17:54 Comment(0)

© 2022 - 2024 β€” McMap. All rights reserved.