PHPプログラミング

最終更新日:
公開日:

レシピ

文字列

文字列の中で変数や配列、オブジェクトのプロパティを展開する

文字列の中で変数やオブジェクトを展開する方法について解説します。

この記事のポイント

  • 文字列の中で変数を展開する方法が分かる
  • 配列やオブジェクトのプロパティも文字列内で展開できる
  • 文字列内で関数を実行する

目次

コードをシンプルにできる文字列での変数展開

文字列の中では変数をはじめ、次のような配列やオブジェクトを展開することができます。

  • 変数
  • 配列
  • オブジェクトのプロパティ&メソッド
  • 関数

これらは全て文字列内で展開が可能です。
ただし、それぞれで書き方が異なっています。

1つずつ順に書き方を解説していきます。

よくある文字列と変数の組み合わせ

文字列と変数を組み合わせて動的にテキストの内容を変えたい場合、よく使われるのは文字列演算子「.」を使ったものではないでしょうか。

文字列演算子による文字列と変数の組み合わせ

<?php

$test = 'テスト';
echo "こちらは".$test."環境です。"; // => 「こちらはテスト環境です。」と出力される

文字列と変数を組み合わせるのに確実な方法ではあります。
しかし、文字列の中に含まれる変数の数が多くなるほど「.」が増え、書き忘れによるエラーが起こりやすくなったり、コードが読みづらくなってしまいます。

変数を文字列内で展開する

そこで、文字列演算子を使わない書き方へ変更していきます。

PHP コード例

<?php

$test = 'テスト';
echo "こちらは{$test}環境です。"; // => 出力内容は上記と同じ「こちらはテスト環境です。」

出力内容は先ほどのコードと同じですが、文字列を「"」で囲って、変数と「.」で連結して…という煩わしさが無くなりました。
代わりに変数を「{}」で囲って書くことで、文字列の中に変数があること明示しています。

ただし、文字列の中に変数を入れる場合は、文字列を必ず「"(ダブルクォーテーション)」で囲む必要があることに注意してください。
'」で囲った場合は「{$test}」」がそのまま文字列として出力されます。

配列の値を文字列内で展開する

配列の値についても、変数同様に文字列の中で展開することができます。

配列の値を展開するコード例

<?php

$test_array = array(
  'message1' => 'テスト',
  'message2' => '本番',
);
echo "こちらは$test_array[message2]環境です。"; // => 「こちらは本番環境です。」と出力される

配列の場合は変数の時のような「{}」で囲む必要がなくなり、代わりに配列のアクセスしたい要素のキーを「[]」で囲って指定します。
このとき、「'(シングルクォーテーション)」は省略します。

オブジェクトのプロパティ&メソッドを文字列内で展開する

続いて、オブジェクトのプロパティとメソッドを文字列の中で展開します。

例として、次のような「Item」オブジェクトがあることを想定します。
4つのプロパティと、それぞれの値に対するセッター&ゲッターメソッドだけを用意したオブジェクトです。

Item.php

<?php

class Item {

  public $genre;
  public $name;
  private $price;
  private $description;

  public function setGenre($genre=null)
  {
    $this->genre = $genre;
  }

  public function setName($name=null)
  {
    $this->name = $name;
  }
  
  public function setPrice($price=null)
  {
    $this->price = $price;
  }

  public function setDescription($description=null)
  {
    $this->description = $description;
  }

  public function getGenre()
  {
    return $this->genre;
  }

  public function getName()
  {
    return $this->name;
  }

  public function getPrice()
  {
    return $this->price;
  }

  public function getDescription()
  {
    return $this->description;
  }
}

$item = new Item();
$item->setGenre('ドーナッツ');
$item->setName('オールドファッション');
$item->setPrice('100');
$item->setDescription('最もオーソドックスなドーナッツ。外はサクッと、中はシットリ。');

echo "{$item->name}の特徴:{$item->getDescription()}";

Itemオブジェクトのインスタンスを生成し、プロパティとメソッドを文字列の中で展開しています。

出力例

オールドファッションの特徴:最もオーソドックスなドーナッツ。外はサクッと、中はシットリ。

変数と同様に「{}」で囲むことで$item->nameを出力することができます。
メソッドについても同じ形式で呼び出して、取得した結果をそのまま展開することができます。

定数を文字列内で展開する

定数は変数と同じ方法で展開できそうですが、実はそのままではできません。

定数の場合は素直に文字列演算子「.」を使う方法か、もしくは次のような出力するだけの関数を用意することで展開することができます。

定数を文字列内で展開する例

<?php
// 定数を宣言
define("TEST_MESSAGE", "テスト");

// 定数を出力するためのクロージャ
$constant = function($c){ return $c; };

echo "こちらは{$constant(TEST_MESSAGE)}環境です。";

出力例

こちらはテスト環境です。

$constantに定数の値を返すだけのシンプルな無名関数(クロージャ)を代入し、文字列内で変数の時と同じように「$constant(定数名)」と書くことで定数を展開することが可能になります。

文字列の中で定数を展開するパターンが何度かありそうであれば、今回のように無名関数を用意しておくと他でも使い回すことができて便利です。

関数を文字列内で実行する

最後に、通常の関数を文字列の中で実行する方法です。
関数についても定数と同じように無名関数を使うことで実現できます。

関数を文字列内で実行するコード例

<?php

// 関数を呼び出すためのクロージャ
$func = function($func_name, $var1=null){ return $func_name($var1); };

// 関数の宣言
function testEcho( $var1=null) {

  // 引数がある場合は引数を返し、無い場合は「テスト」を返す
  if( !empty($var1) ) {
    return $var1;
  } else {
    return "テスト";
  }
}

echo "これは{$func('testEcho','本番')}環境です。"; // => 「こちらは本番環境です。」と表示される

定数と違い、無名関数に実行したい関数名を指定する際は、定数と違い「'(シングルクォーテーション)」で囲む必要があることに注意してください。

引数がある場合は、通常の関数実行と同じように関数名の後に指定していきます。
今回はシンプルに引数を1つだけとしていますが、必要に応じて複数設定することも可能です。