【PHP入門2021】PHPのデータ型② 文字列型(string) ~使い方・確認・変換まで解説します

PHP

PHPの文字列型(string)とは?

PHPの文字列型は文章や単語や名前などの文字列として値を扱いたいときに使います。

PHPの文字列型のルール・規則

  • 文字列はシングルクォート(‘)かダブルクォート(“)で囲む
  • 文字列の中に囲み文字を使いたいときは¥でエスケープ処理(無効化)する
  • ダブルクォートの中では変数を展開できる。シングルクォートはできない。

PHPの文字列型の代入(宣言)

シングルクォート(‘)かダブルクォート(“)で囲みます。

$mojiretsu = “Hello!”; //ダブルクォート
$mojiretsu = ‘Hello!’; //シングルクォート

PHPの文字列型の使い方

文字列の結合

PHPで文字列を結合するには文字列結合演算子であるピリオド(.)を使います。

$mojiretsu = "Hello!";
$name = "Taro";
echo $mmojiretsu . $name; //文字列を連結してHello!Taroが出力

他のプログラミング言語では+で結合がよく用いられるので感覚的に間違いやすく、現場では間違って+を使ってしまうという人為的なバグが現実的に多発しています。

+を使ったらエラーになってくれればよいのですが、下手に動いてしまうのがPHPのやっかいなところで、+は算術演算子の加算なので、数値変換されて文字列の連結とは違う動きをしてしまいます。

文字列の中で変数を展開する

ダブルクォートで囲む

文字列型には中に変数を埋め込んで展開できる便利な機能があります。

文字列をダブルクォートで囲み、{$変数名}のようにして埋め込みます。

$name = "Taro";
$mojiretsu = "Hello!{$name}"; //ダブルクォート
echo $mojiretsu . PHP_EOL; //Hello!Taro が出力

※囲み文字の{}は無くてもいいのですが、例えば変数$colorや$color_nameなどがあったとき囲みで区切られてないと、どの変数を適用すべきかわかりづらくなってしまいます。作法として{}で囲むようにしましょう。

シングルクォートで囲む

一方、シングルクォートで囲んだときは展開されません。

$name = "Taro";
$mojiretsu = 'Hello!{$name}'; //シングルクォート
echo $mojiretsu . PHP_EOL; //Hello!{$name} と出力される

囲み文字自体を使うためのエスケープ

文字列の中に囲み文字自体を入れたいときはエスケープ処理(無効化)を行います。

echo 'ダブルクォート「\'」を出力' . PHP_EOL; //シングルクォートの中にシングルクォート
echo "ダブルクォート「\"」を出力" . PHP_EOL; //ダブルクォートの中にダブルクォート

両クォートの中で¥が特別な文字として使われてしまったので、¥自体を出力したいときは¥¥と入力します。

echo "\\" . PHP_EOL; //\を1文字出力
echo '\\' . PHP_EOL; //\を1文字出力

エスケープシーケンス

ダブルクォートの中では文字列の中にタブや改行などの人の目に見えない特別な文字(エスケープシーケンス)を含むことができます。

主なエスケープシーケンス

¥r →復帰
¥n →改行
¥t →タブ
¥¥ →バックスラッシュ
¥” →ダブルクォート

ちなみによく出てくるPHP_EOLというのは”\r\n”のことです。(Windows以外は\n)

改行を入れて複数行を出力

echo "1行目\r\n2行目"; //windowsの改行は\r\n、その他は\n

■出力結果

1行目
2行目

ヒアドキュメント

長い文字列には便利なヒアドキュメント

例えば複数行のメール本文などを変数にしまいたいときなんかは、¥r¥nなどをいちいち使っていてはとても面倒です。
そんな時に大活躍するヒアドキュメントという超便利な機能があります。

ヒアドキュメントはこのような形式です。

<<<MAIL

このあいだに好きな文字列を書く

MAIL;

まず、例を挙げます。

$mail_text =<<<MAIL
花子さま

PHPって面白いですよね!

太郎より
MAIL;

echo $mail_text;

なんとなくイメージはついたでしょうか?

こうすることで書いたテキストが改行付きで見た目そのまま出力されます。
タブも改行も入力したままが代入されます。

これをエスケープシーケンスなどを使うと¥r¥nを繰り返し使ってとても面倒です。

ヒアドキュメントのルール

一度、まとめておきます。

  • <<<【囲み文字列】~【囲み文字列】;の間に文字列を書く
  • 最後の【囲み文字列】;の行はそれ以外の余計な文字を一切含んではいけない。
  • この【囲み文字列】は自分で名前をつけられる。(大文字英字が通例)

また、ヒアドキュメントは代入せずにechoなどで直接出力することもできます。

#直接出力
echo <<<'TEXT'
はろ~!
TEXT;

変数やエスケープシーケンスの展開

さらになんと変数展開もできます。エスケープシーケンスも使えます。

$second = 3;

$mail_text =<<<TEXT
爆発まであと残り{$second}秒・・・
	すぐに脱出してください。

TEXT;

変数を展開させない

逆に変数やエスケープシーケンスを展開させないことも可能です。囲み文字の開始部分にシングルクォート’を付けます。終了部分にはいりません。

$mail_text =<<<'TEXT'
爆発まであと残り{$second}秒・・・
	すぐに脱出してください。

TEXT;

■出力結果

爆発まであと残り{$second}秒・・・
	すぐに脱出してください。

ヒアドキュメントの弱点

ヒアドキュメントも便利なことばかりではありません。
ヒアドキュメントは便利ですがソースがちょっと見にくくなることがあります。それはインデントの問題です。

	if($flg1 == true){
		if($flg2 == true) {
			$mail_text =<<<MAIL
花子様

PHPって面白いですよね!

太郎

MAIL;
		}	
	}

こんな風にPHPは複数段階のロジックが入れ子になるとインデントが増えていくものですが、ヒアドキュメントの中をインデントしてしまうとタブやスペースとして認識してしまい、値として入ってしまいます。

なので、せっかくきれいに見やすくインデントされたソースコードに急にインデントがない行が入ってしまって扱いづらいというデメリットもあります。

PHPの文字列型の確認・チェック

その値が文字列型かどうかをチェックする方法で主要なやり方を2つ紹介します。

is_string()

その値の型が文字列なら真、その他の型なら偽を返します。

$mojiretsu = "文字列です"; //文字列代入

if(is_string($mojiretsu)){
	prrint "mojiretsuの型はstringです!" . PHP_EOL;  //ここが出力される
}

gettype()

gettype()はその値の型名を返します。stringなら文字列です。

$mojiretsu = "文字列です"; //文字列代入
echo gettype($mojiretsu). PHP_EOL; //string と出力される

PHPの文字列型の変換

他のデータ型から文字列型への変換で主なやり方を2つ紹介します。

専用の関数strval()で変換

strval()は他のデータ型から文字列型に変換をします。

$mojiretsu2 = 100; //100という整数を代入
echo gettype($mojiretsu2) . PHP_EOL; //integer と出力される
$mojiretsu2 = strval($mojiretsu2); //文字列型に変換
echo gettype($mojiretsu2). PHP_EOL; //string と出力される

キャストによる変換

変換の型を指定して明示的に変換することをキャストといいます。
(string)を使います。

$mojiretsu2 = 100; //100という整数を代入
echo gettype($mojiretsu2) . PHP_EOL; //integer と出力される
$mojiretsu2 = (string)$mojiretsu2; //文字列型に変換
echo gettype($mojiretsu2). PHP_EOL; //string と出力される

その他の型から文字列型にキャスト

その他のデータ型から文字列型にキャストする例を紹介します。
特にnullやboolean型は覚えておきましょう。

var_dump((string)null);          // nullは空文字
var_dump((string)true);          // trueは1
var_dump((string)false);         // falseは空文字
var_dump((string)999.999);       // 数字はそのまま文字列に
var_dump((string)array("aaa"));  // Arrayと出力
var_dump((string)new Exception("メッセージ")); //エラー情報を出力(内容はクラスによる)

コメント

タイトルとURLをコピーしました