フルスタックエンジニアのノウハウ
2021.07.24    2022.06.11

PHPマニュアル要点まとめ#11「型:文字列(後編)」

この記事の動画版はこちら(画像クリックでYoutubeに飛びます)

チャンネル登録お願いします!


※この記事はPHPマニュアルの解説です。


今回は、前回の続きとして「型」の章から「文字列」の後半部分を読んでいきます。



文字列【要点まとめ】


言語リファレンス > 型 >「文字列」の解説です。
マニュアルページを見ながらご覧ください。



文字単位のアクセスと修正


PHPでは、文字列が入っている変数に対して括弧で数字を指定すると、先頭から数えたその順番の文字を取り出すことができます。


先頭は「0」からスタートしますので、例えば、このような文字列が入った変数に対して、0番目を指定すると「T」という文字が取り出され、2番目を指定すると「i」が取り出されるという訳ですね。




この「strlen()」という関数は、文字列全体の長さを取得する関数なので、21という数字が取得され、そこから1を引いた20番目の文字が取得されます。




取得するだけでなく、このように書き換えることもできます。




先ほどと同じように、文字列全体の長さから1を引いた場所、つまりこの最後の1文字を「e」に書き換えています。


最後の部分が「see」となる訳ですね。


この使用方法について、いくつか注意点が書かれています。

・PHP7.1.0以降では、数字の部分に負の数も指定できるようになりました。負の数を指定した場合、文字列の先頭からではなく末尾からの指定となります。

・PHP8.0.0以前は、波括弧でも指定できましたが現在は角括弧のみが指定できます。

・文字列の長さの範囲外の数字を指定した場合は、空いた部分が空白で埋められます。

・角括弧を使った指定方法は、シングルバイト(半角文字)のみに使用できます。日本語などのマルチバイト文字には使用できません。マルチバイト文字に対して使用すると、文字化けした文字が取り出されてしまいます。

・PHP7.1.0以降では、文字列変数に対して、空のインデックス(つまり、数字を指定せず角括弧のみ)を指定すると、fatalエラーが発生するようになりました。



数字の部分は「整数」または「整数と見なせる文字列」のみを指定することができます。



上の文字列のうち「1」という整数と見なせるためOKです。


「1.0」「x」「1x」といった整数と見なせないものはNGとなり、警告が発生します。



文字列や、配列、オブジェクト以外のデータ型の変数に角括弧を指定しても、単にnullが返されます。



文字列の操作


文字列は「.」ドットを使うと結合することができます。


結合したい文字列や、文字列変数同士を「.」でつなげばOKです。


ちなみに、JavaScriptでは文字列結合には「+」記号が使われますね。


PHPの場合は「.」だと覚えておきましょう。


PHPには、文字列を操作するための便利な関数が多く用意されており、文字列全体の長さを取得する「strlen()」もその1つです。



他のデータ型から文字列型に変換する際の仕様


他のデータ型の変数を文字列型に変換するには、その変数の頭に(string)と書いてキャストするか、strval()関数を使って変換します。


ただし、echoやprintなどの関数にデータを渡す場合や文字列との比較を行う場合などは、型変換は自動的に行われますので、型変換を意識的に行う必要は特にありません。


bool型を文字列に変換する場合は、trueは「文字列の1」、falseは「空文字」に変換されます。


int型を変換する場合は「その数字」、float型を変換する場合は「指数表記」で変換されます。


配列型を変換すると「Array」という文字列として変換されます。


デバッグを行う際に、変数をechoしようとして「Array」と表示されてしまうことがよくありますが、これはその変数が「配列型」になっているということですね。


そういう場合は、echoではなく「var_dump()」や「print_r()」といった配列の出力に対応したデバッグ関数を使うようにしましょう。


オブジェクト型を変換する場合は「__toString」というメソッドを使用します。


リソース型を変換すると、「Resource id #1」のような文字列に変換されます。


nullを変換すると「空文字」に変換されます。


また、serialize()という関数を使うと、変数の値や型などの構造を保持したまま恒久的な文字列に変換することもできます。



文字列型の詳細


PHPでは、文字列型は内部的にはバイトとして保持しています。


PHPに「バイト型」が存在しないのは、この文字列型が実際はバイト型だからです。


そのため文字列以外のデータ、例えばネットワークソケットから読み込んだデータなども文字列型として扱われます。


内部的にはバイトとして保持していますが、それを文字として表現(エンコード)する際、PHPはそのスクリプトファイル自体のエンコードに従います。


例えば、そのPHPファイルが「ISO-8859-1」で書かれていたなら、文字列は「ISO-8859-1」でエンコードされます。


ただし、Zend Multibyteという仕組みが有効になっている場合は、各スクリプトファイルのエンコードではなく、別途設定された共通設定に従ってエンコードされます。


注意点として、PHPに用意されている各種関数には、エンコーディングを判断する方法が統一されていないことがあります。


例えば、substr()、strpos()、strlen()、strcmp() といった関数は文字列がシングルバイトでエンコーディングされるものと見なしていたり、htmlentities()やmbstring系の関数はエンコーディング情報を引数として受け取る形になっていたり、strcasecmp()や、strtoupper()などはロケール(国や地域の設定)がマッチしている必要があったり、utf8_decode()などのように特定のエンコーディング(UTF-8)を前提としている関数もあります。


このように、PHPに用意されている各種関数は、使用している文字のエンコードによっては正しく動かない場合がありますので注意して使うようにしましょう。


日本語を扱う場合は、mbstring系の関数を使うのが良いかと思います。


おすすめ記事