PHPプログラミング

ベストプラクティス

文字列の扱い

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

  • このエントリーをはてなブックマークに追加

文字列の中で変数を展開し、内容を動的に変更する時に便利な方法を解説します。配列やオブジェクトのプロパティ&メソッド、定数、関数の場合についても解説。

目次

  1. #  コードをシンプルにできる文字列での変数展開
  2. #  よくある文字列と変数の組み合わせ
  3. #  変数を文字列内で展開する
  4. #  配列の値を文字列内で展開する
  5. #  オブジェクトのプロパティ&メソッドを文字列内で展開する
  6. #  定数を文字列内で展開する
  7. #  関数を文字列内で実行する

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

今回は文字列の中で変数を使用する方法を解説して行きます。次のような方が対象です。

  • 文字列の中で変数を使用したい
  • 文字列演算子を使わないでコードをシンプルにしたい
  • 配列やオブジェクトのプロパティ&メソッドを文字列内で展開したい
  • 定数や関数を文字列内で展開したい

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

それでは、1つずつ順に書き方を解説していきます。

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

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

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

<?php

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

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

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

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

<?php

$test = 'テスト';
echo "こちらは{$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;
	}

}

このオブジェクトからインスタンスを生成し、プロパティを文字列の中で引用してみましょう。

オブジェクトのプロパティを文字列内で展開する例

<?php
// ファイル読み込み
require_once 'class/Item.php';

// インスタンスを生成して値を設定する
$item = new Item();
$item->setGenre('ドーナッツ');
$item->setName('オールドファッション');
$item->setPrice('100');
$item->setDescription('最もオーソドックスなドーナッツ。外はサクッと、中はシットリ。');

echo "こちらは{$item->name}です。{$item->getDescription()}";
// => 「こちらはオールドファッションです。最もオーソドックスなドーナッツ。外はサクッと、中はシットリ。」と表示される

変数と同様に「{}」で囲むことで、$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つだけとしていますが、必要に応じて複数設定することも可能です。

  • このエントリーをはてなブックマークに追加