Help us understand the problem. What is going on with this article?

PHP で複数の値を連結して echo する時のちょっとした tips

PHP で複数の値を連結して出力する際に, 以下のように . (ドット) で連結して echo する方は結構多いのではないでしょうか? (自分も最近までそうしてました)

例えばこんな風に.

<?php
$name = "Taro";
$age  = 18;

echo "Name: " . $name . " Age: " . $age . PHP_EOL;

しかしこのコードは以下のように , (カンマ) で連結して書くこともできます.

<?php
$name = "Taro";
$age  = 18;

echo "Name: ", $name, " Age: ", $age, PHP_EOL;

ドットとカンマの違い

上の 2 つのコードは出力結果が同じですが, 前者と後者でコードの意味が違います.

ドットを使う場合

<?php
echo $a . $b . $c;
  1. $a$b$c を連結した文字列を新しく作成する
  2. 作成した文字列を echo する

わざわざ解説するまでもないですが, 文字列連結演算子を使って複数の文字列を連結し, その結果を echo しています.

カンマを使う場合

<?php
echo $a, $b, $c;
  1. $a を echo する
  2. $b を echo する
  3. $c を echo する

という具合に, 複数の echo 文を並べるのと同じ意味になります.

どちらを使うべきか?

特別な事情 1 がなければカンマを使ったほうが良いと思います. 例えば大量の文字列を返す関数呼び出しの結果を連結する場合を考えてみましょう.

<?php
echo very_long_string_generator1() . very_long_string_generator2() . very_long_string_generator3();

このコードは, 以下のような動作をします.

  1. very_long_string_generator1(), very_long_string_generator2(), very_long_string_generator3() の結果をそれぞれ文字列で取得する
  2. 1. で生成した3 つの文字列を連結して新しい文字列を生成する
  3. 2. で生成した文字列を echo する

この挙動だと, 1. で巨大な文字列を 3 つ取得した後, さらにそれらを連結した新しい文字列を生成するわけで, メモリを大量に消費してしまいます.

一方で

<?php
echo very_long_string_generator1(), very_long_string_generator2(), very_long_string_generator3();

このコードの場合だと

  1. very_long_string_generator1() の結果を出力する
  2. very_long_string_generator2() の結果を出力する
  3. very_long_string_generator3() の結果を出力する

という具合に, 文字列を連結するのではなく随時出力するのでメモリの無駄がありません.

レガシーな環境ではこんな利点が

PHP のクラスは __toString というメソッドを定義することで, そのクラスを好きなフォーマットで文字列として表現することが出来ます.

<?php
class Hoge
{
    public function __toString()
    {
        return "My Hoge class";
    }
}

$obj = new Hoge();
echo $obj; // My Hoge class

ところがオブジェクトと文字列を連結した場合, PHP 5.1 系では __toString() が使われないという仕様があります.

<?php
class Hoge
{
    public function __toString()
    {
        return "My Hoge class";
    }
}

$obj = new Hoge();
echo "I am " . $obj . PHP_EOL;

このコードの PHP のバージョン毎の出力結果は以下の通りです.

5.1.1
I am Object id #1

5.1.6
I am Object id #1

5.2.0
I am My Hoge class

5.2.17
I am My Hoge class

5.3.0
I am My Hoge class

5.3.28
I am My Hoge class

5.4.0
I am My Hoge class

5.4.37
I am My Hoge class

5.5.0
I am My Hoge class

5.5.21
I am My Hoge class

5.6.0
I am My Hoge class

5.6.5
I am My Hoge class

PHP 5.2.0 以降は Hoge クラスの __toString() が参照されて I am My Hoge class と出力されていますが PHP 5.1 系のみ I am Object id #1 になってしまうことが分かります.

ところがカンマを使った場合だと

<?php
class Hoge {
    public function __toString()
    {
        return "My Hoge class";
    }
}

$obj = new Hoge();
echo "I am ", $obj, PHP_EOL;
5.1.1
I am My Hoge class

5.1.6
I am My Hoge class

5.2.0
I am My Hoge class

5.2.17
I am My Hoge class

5.3.0
I am My Hoge class

5.3.28
I am My Hoge class

5.4.0
I am My Hoge class

5.4.37
I am My Hoge class

5.5.0
I am My Hoge class

5.5.21
I am My Hoge class

5.6.0
I am My Hoge class

5.6.5
I am My Hoge class

ご覧の通り PHP 5.1.1 から PHP 5.6.5 までのすべてのバージョンで同じ結果になることが確認できました. (※スペースの都合でその他のバージョンは端折っています)

CentOS 5 系 + PHP 5.1.6 みたいなインフラで現役稼働しているシステムもまだまだあるのではと思いますが, レガシーな環境の保守などで是非活用いただければと思います.

関連記事


  1. 例えば 出力制御関数 を使って echo の挙動を意図的にカスタマイズしている場合など 

trashtoy
自作の汎用 PHP クラスライブラリ "PEACH" を公開しています. http://trashtoy.github.io/ (最新版: ver 2.1.1, 2015-09-11 更新) PHP, Java, Javascript, HTML, CSS あたりに興味関心があります.
http://trashtoy.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした