文字列内に変数を展開する - PHP5 プログラミング
PROGRAM
文字列内に変数の値を展開する
PHP5 で、変数を使って文字列を組み立てる方法について考えてみます。
たとえば $key に "Title" という文字列が、$value に "Main Menu" という文字列が格納されていた場合、その二つを使って "Title: Main Menu" という文字列を作りたいとき、PHP5 では次の 3 つの方法があると思います。
- 文字列の連結演算子を使う方法
- 文字列リテラル内で展開する方法
- sprintf 関数を使う方法
これらで文字列を組み立てる方法について、簡単に見ていきます。
文字列の連結演算子を使う方法
まず、文字列の連結演算子を使って組み立てる方法です。
PHP5 では "." 演算子を使って文字列を連結することができます。変数に格納されている値も文字列として連結できるので、次のようにすることで変数を使って文字列を組み立てられます。
$string = $key . ': ' . $value;
順序立てて加えて行けるので判りやすい気もしますが、プログラムコードは以外と複雑になりがちです。
クラスのプロパティや関数の戻り値などにも対応できるので、応用力の広い書き方です。
文字列リテラル内で展開する方法
PHP5 で文字列内に変数の値を展開するいちばんシンプルな方法が、文字列リテラル内で展開する方法です。
文字列リテラルを二重引用符で作成した場合、中に記載した "$変数名" は、そのままその変数の値に置き換えられます。
$string = "$key: $value";
そのため、このように記載するだけで、変数を使った文字列を簡単に組み立てられます。
このとき、文字列と変数名を明確に分けたい場合は、変数名を中括弧で括ります。
$string = "${key}: ${value}";
このように記載すれば、たとえば変数の値に続けてアルファベット文字列を空白を挟まずに続けたい場合でも対応できます。
この方法がいちばんシンプルで判りやすいと思いますが、関数の戻り値を文字列に含めたい場合などには使用できません。
sprintf 関数を使う方法
PHP5 では sprintf という、フォーマット文字列を使って文字列を組み立てる関数が使用できます。
フォーマット文字列については "PHP: sprintf -Manual" に記されていますが、よく使うものとしては次のものがあります。
%s | この部分を "文字列" で置き換えます。 |
---|---|
%d | この部分を "数字" で置き換えます。 |
%f | この部分を "小数点数" で置き換えます。 |
他にもいろいろ種類があったり、表示文字数や小数点の位を調整したりもできます。
sprintf 関数では、フォーマット文字列の "%s" などの部分を、第二引数以降で指定した変数の値に置き換えた文字列を取得できます。
$string = sprintf('%s: %s', $key, $value);
このように、使う変数と文字列とが分離されるのでこれまでとは勝手が変わってきますが、最初のテキストでおおよその構造が見られるのが便利な場合があります。
ただし、フォーマット文字列に登場する変数の順番と引数に渡す変数の順番を一致させる必要があるため、プログラミングの際には少し気を遣います。
なお、同じ変数を複数回使うような場合にも、このフォーマット文字列を使う方法であれば、変数名を 1 箇所だけに書いて使いまわすことができます。
例えば "SELECT * FROM $tableName WHERE $fieldName=$fieldValue ORDER BY $fieldName" というような文字列を作りたいとき、$fieldName という変数を 2 回使用しています。
sprintf 関数のフォーマット文字列では、何番目の引数をそこに適用するかを、フォーマットを表す "%" 記号とフォーマット指定の間に $1 や $2 などを加えることによって指定できます。
$string = sprintf('SELECT * FROM %1$s WHERE %$2s=%$3s ORDER BY %$2s', $tableName, $fieldName, $fieldValue);
このようにすることで、2 番目に指定した変数 $fieldName を、フォーマット文字列に 2 箇所ある '%$2s' のところ両方に適用されます。
この方法を使う上での注意としては、適用する変数を指定するのに "$" という記号を使うため、フォーマット文字列を二重引用符で括ってしまうと、そこが変数の値として処理されてしまい、意図したとおりの文字列を生成できないことがあります。
フォーマット文字列を二重引用符で指定する必要がある場合は、"$" 記号の頭に "\" 記号を付けてエスケープ処理する必要があります。
[ もどる ]