PHP – 雛形 – ファイル操作

ファイルの確認

file_exists~ファイルの存在確認

基本形

file_exists()は引数で指定したファイル名のファイルが存在するかどうかを確認する。(PHP-manual)

file($filename)

戻り値はファイルの存在/不存在に従ってtrue/false。

is_readable~ファイルの読み込み可能性確認

is_readable()はファイル名を指定したファイルが存在し読み込み可能かどうかを確認する。(PHP-manual)

is_readable($failename)

戻り値は指定したファイルが存在し読み込み可能な場合はtrue、それ以外の場合にfalse

ファイルのオープン/クローズ

fopen~ファイルのオープン

基本形

多くのファイル操作では、最初にファイルをオープンしてファイルポインターリソースを取得する。ファイルの書き込みや読み込みはファイルリソースを通して行う。

fopen()は第1引数にファイル名、第2引数にモードを指定する。モードは書き込み/読み込み、ファイルポインターの位置などに応じて所定の文字列で指定。(PHP-manual)

fopen($filename, $mode)

エラー処理

fopen()の戻り値はresource型だが、オープンに失敗した場合の戻り値はfalse。このため、fopen()のエラーチェックは明示的にfalseであるかどうかを比較する。

flose~ファイルのクローズ

基本形

fopen()得られたファイルポインターリソースを引数に指定してファイルを閉じる。

flose($file)

エラー処理

fclose()の戻り値はbool型で、処理の成功/失敗に応じてtrue/falseが返される。しかし、明示的にfclose()に対するエラーチェックを行うのが一般的なのか(あるいはそうすべきなのか)どうか不明。

行単位の書き込み・読み込み

fwrite~行単位の書き込み

基本形

テキストを行単位で書き込むにはfwrite()を使う。エラー処理を全て除いた基本的な流れは以下の通り。

  1. fopen(ファイル名)でファイルをオープンしてファイルハンドラーを取得
    • モードの指定は新規書き込み('w')、追加書き込み('a')など
    • PHP-manual
  2. fwrite(ファイルハンドラー, 行データ)で行データを順次書き込み
    • 改行文字\nは付けられないので、必要に応じて追加書き込み
    • PHP-manual
  3. flcose(ファイルハンドラー)でファイルをクローズ

上の例では\nを付加しており、出力ファイルの内容は以下のようになる。

エラー処理

fwrite()の戻り値はint型で書き込んだバイト数を返すが、書き込みに失敗した場合の戻り値はfalse。このため、fwrite()のエラーチェックは明示的にfalseであるかどうかを比較する。

fgets~行単位の読み込み

基本形

fgets()\nで区切られた行単位でデータを読み込む。エラー処理を除いた基本的な流れは以下の通り。

  1. fopen(ファイル名)でファイルをオープンしてファイルハンドラーを取得
    • モードの指定は読込('r')など
    • PHP-manual
  2. fgets(ファイルハンドラー)で行データを順次読み込み
    • 通常while文でファイルの最後に行きつくまで順次読み込む
    • PHP-manual
  3. flcose(ファイルハンドラー)でファイルをクローズ

このコードでは、最低限ファイルが存在して読み込み可能なことをis_readble()でチェックしている。

また行データを読み込んだ後、ブラウザーで改行させるため<br>を付加している。その表示結果は以下の通り。

読み込み終了処理

fgets()の戻り値はstring型で読み込んだテキストを返すが、読み込むデータがない場合はfalse。このため、fgets()はのエラーチェックは明示的にfalseであるかどうかを比較する。

一括書き込み・読み込み

file_put_contents

基本形

file_put_contents()は、ファイル名を直接指定してデータを一括して書き込む。(PHP-manual)

この例では配列を直接渡して全要素を書き出しているが、要素間に改行文字は挿入されず、連続して書き込まれる。

要素ごとに行を区切る場合には、foreachで要素を取り出して改行文字\nを付加して書き込む。ただしこのときは前のデータを上書きしないようにFILE_APPENDフラグを立てる必要があるが、そうすると既にファイルが存在している際に追加書き込みになってしまう。

ファイルが存在しない(あるいは空のファイルが存在する)場合のファイルの内容は以下のようになる。

エラー処理

file_put_contents()の戻り値はint型で書き込んだバイト数を返すが、書き込みに失敗した場合の戻り値はfalse。このため、file_put_contents()のエラーチェックは明示的にfalseであるかどうかを比較する。

file_get_contents

基本形

file_get_contents()はファイル名を指定してその内容を一つの変数に読み込む。(PHP-manual)

改行文字\nもそのまま読み込まれるが、ブラウザーでは反映されないため、上のコードの表示結果は以下のようになる。

一括取得されたテキストをブラウザー上で改行させたい場合には、以下のように\n<br>に置き換えるとよい。

エラー処理

file_get_contents()の戻り値はstring型で読み込んだデータを返すが、読み込みに失敗した場合の戻り値はfalse。このため、file_get_contents()のエラーチェックは明示的にfalseであるかどうかを比較する。

readfile

基本形

readfile()はファイルの内容を一括して読み込み、それを直接表示する。(PHP-manual)

改行文字はブラウザーでは反映されないため、行単位で区切られたファイルでも表示は以下のようになる。

エラー処理

readfile()の戻り値はint型で読み込んだデータのバイト数を返すが、読み込みに失敗した場合の戻り値はfalse。このため、file_get_contents()のエラーチェックは明示的にfalseであるかどうかを比較する。

CSVファイルの書き込み・読み込み

fputcsv

基本形

fputcsv()は配列データをCSVファイルとして書き込む。基本の流れはfwrite()と同じ。(PHP-mannual)

上記のコードで配列をCSVとして書き込んだファイルの内容は以下の通り。

エラー処理

fputcsv()の戻り値はint型で書き込んだ文字数を返すが、書き込みに失敗した場合の戻り値はfalse。このため、file_put_contents()のエラーチェックは明示的にfalseであるかどうかを比較する。

fgetcsv

基本形

fgetcsv()はCSVからデータを読み込む。読み込みは行ごとに行われ、1つの行(フィールドは)カンマ(あるいは指定した文字)で区切られたデータごとに分けられ、1次元の配列として返される。(PHP-manual)

上記コードの表示結果は以下の通り。

エラー処理

rgetcsv()の戻り値は読み込んだ行のデータの数値展示配列だが、無効なハンドルを受け取った場合はnull、ファイル終端に達したときやその他のエラーの場合はfalseを返す。このため、fgetcsv()のエラーチェックは明示的にfalseであるかどうかを比較する。

 

PHP – 雛形 – GET/POST

画面遷移するGET

以下の例は、入力画面のformでテキストを入力し別ページにGETでデータを渡す。遷移後のページでスーパーグローバル変数$_GETを介してデータを受け取り、それを表示している。GETメソッドをPOSTに変更しても動作する。

入力ページ

遷移後の表示ページ

入力ページの要点

  • htmlファイルでもいいが、将来の変更可能性を見据えてphpファイル
  • form要素でmethod属性をgetに、action属性で遷移先のページを指定
  • テキスト入力はinput要素でtype属性をtextに、name属性の値は受信側の変数で使われる
  • 送信ボタンはinput要素のtype属性をsubmitにして配置

遷移後のページの要点

  • スーパーグローバル変数$_SERVER['REQUEST_METHOD']で送信側のメソッドが'GET'であることを確認('POST'の場合は以降が無視されて$messageは空のまま)
  • スーパーグローバル変数$_GETは連想配列で、送信側のname属性で指定した値をキーとして値を取り出す
  • isset()$_GETがundefinedの場合はエラー処理
  • テキストボックスが空のままGETされると空文字列になるため、必要に応じてその処理
  • テキストが有効な場合表示処理
  • ユーザー入力を表示する場合は必ずhtmlspecialchar()で特殊文字を変換

画面遷移しないPOST

次の例ではページ遷移をせず、formからPOSTで送信されたデータを同一ページに反映させている。POSTメソッドをGETに変更しても動作する。

要点は1つ前の画面遷移する場合と同じ。

 

PHP – 雛形 – HTML要素の生成

HTMLへの内容の書き込み

HTMLへの直接書き込み

以下のコードはPHPのコードを直接HTML内に埋め込んで、その出力をHTMLの内容とする例。実行後のHTMLソースにはPHPのコードは表示されず、出力結果のみが反映される。

PHPファイル

実行後のHTMLソース

HTMLへの変数内容の書き込み

PHPの変数をHTMLの外側で定義し、HTML内でそれを出力する例。

実行後のHTMLソース

HTML要素の繰り返し書き込み

for文によるHTML要素の生成

以下の例ではfor文で指定した個数のli要素を生成している。

実行後のHTMLソース

foreachによるselect要素の設定

この例ではselect要素の中のoption要素を連想配列に基づいて生成している。

実行後のHTMLソース

 

PHP – 雛形 – 別ページへの遷移

概要

現在のページからPHPが書かれた他のページ(拡張子php)に遷移したい場合のテンプレート。

HTMLから

同じドキュメントルート内にターゲットがある場合、普通にファイル名を書けばよい。

他のディレクトリーにターゲットがある場合、相対パスでの指定も可能。

サーバーアドレス指定

スーパーグローバル変数$_SERVERからサーバーのIPアドレスを取り出して、そのドキュメントルートから指定することもできる。

PHPから

header関数

header()関数で’Location:’を設定して遷移する。header()後のexitが必要。注意点として、header()の前には空白行を含めて一切の出力がないこと(PHP-manual)。

以下の例はボタンを押すと別のページに遷移する。

 

PHP – ループ

for

for (var = 初期値; 終了条件; 変更) {...}

C/C++やJava, JavaScriptと同じで、カウンターとなる変数を介する。

このほかに以下の構文も用意されている。

for (継続条件): ... endfor;

while

while (継続条件) {...}

C/C++やJava, JavaScriptと同じで、継続条件が真である間ループを継続する。

このほかに以下の構文も用意されている。

while (継続条件): ... endwhile;

do-while

do {...} while(継続条件);

do-while構文はブロックの最後で継続条件の判断を行う。

無限ループ

無限ループの構文。

for(;;)

while(true)

do-while(true);

foreach

配列の要素の取出し

foreach (array as val) {...}

foreachはPythonのfor inやRubyのeach doと同じく、インデックスを介さずに配列の要素を順に取り出す。

以下の構文も準備されている。

foreach (array as val): ... endforeach;

連想配列のキーと要素の取出し

foreach (assoc_array as key => val) {}

PHPの配列は連想配列と等価なので、PythonのenumearateやRubyのeach_with_indexと同じ処理をforeachで書ける。

 

PHP – undefined, nullのisset()評価

概要

PHPは変数の宣言のみに関する構文はなく、値の定義によって変数が宣言される。

宣言・初期定義なしに変数を用いるとエラーとなるが、Javascriptのように自動的にドキュメントグローバルの変数になってしまって副作用が出かねないのとどちらがいいのか、悪いのか、不勉強のためすぐには結論が出せない。

未定義変数

未定義変数を直接評価するとUndefinedエラー

未定義の変数を評価しようとするとUndefinedエラーになる。

var_dump()で無理やり評価するとNULLになるが、if文の評価には使えない。

未定義変数をisset()で評価するとfalse

未定義の変数をisset()で評価するとbool型のfalse

if文の条件式にisset()の評価結果をそのまま使うと定義/未定義に対する処理が書ける。

null

nullisset()で評価するとfalse

すなわち、isset()で変数の有効性を評価する場合には、その変数が未定義である場合と、nullによって初期化した場合の区別なくfalseの結果に相当する。

定義済み変数

定義済み変数で内容がnullでなければtrue

したがってisset()で変数を評価した時の結果はtrue/falseのいずれか。

 

 

PHP – 様々な値の論理値

概要

PHPの値の論理値は以下の通り。

false true
予約語 false, FALSE, null, NULL true, TRUE
int 0 0以外
float 0.0 0.0以外
string '', '0' 左記以外
isset(val) undefined, null 左記以外

予約語~true, false, null

true, TRUEtruefalse, FALSEfalsenull, NULLfalse

整数~int

int型の整数は0だけがfalse、その他はtrue

実数~float

float型の実数は正確に0.0のときだけfalse、その他はtrue

文字列~string

string型は空文字列('')及び'0'false。その他の文字列はtrue'0.0‘もtrue)。

issetによる未定義変数とnullの評価

未定義の変数をそのまま評価すると、Undefinedエラーとなった上でfalseと評価される。

未定義の変数をisset()関数を通して評価するとfalse

変数の内容がnullの時もisset()関数の評価はfalse

 

PHP – 配列と連想配列

概要

PHPの配列は連想配列と同じで、連想配列のキーが整数で連続しているものが配列として扱われる。

配列

リテラル定義と追加

リテラル定義

配列をリテラルで定義すると、各要素に対して0から順番にインデックスが与えられる。

要素の追加

一度定義された配列に、未設定のインデックスで値を与えると、要素が付け加わえられる。

追加の不連続性

インデックスを飛ばして要素を加えた場合、抜かされたインデックスの要素は飛ばされて新たな要素が付け加えられる(以下の例では3番要素の後に5番要素が加えられ、4番要素は存在していない)。

再定義による上書き

定義済みの配列変数にリテラルで再定義すると、前の内容は破棄されて上書きされる。

インデックスによる定義・追加

未定義の変数へのインデックスによる定義

未定義の変数にインデックスで値を与えると配列として定義される。

インデックスによる追加

インデックスが飛んでいてもそのまま追加される。飛ばされた要素が埋められることはない。

追加の不連続性

中抜けになっているインデックスで要素を定義した場合、インデックスは整列せず後ろに付け加えられる。

値の型の混在

値にintやstringなど異なる方が混在してもよい。

空の配列への順次追加

空の配列を準備し、順次要素を追加する手順。

  1. 変数に空の配列[]を定義する
  2. キーを指定せず変数名[]=値で順次代入

 

連想配列

リテラル定義と追加

リテラル定義

キーと配列を=>で結んだリテラルで連想配列を定義。値に異なる方が混在してもよい。

キー指定による追加

キーを指定して末尾に要素を追加。

キーによる定義・追加

未定義の変数にキーを指定して値を与えると連想配列として定義される。

定義済みの連想配列にキーと値を指定して要素を追加。キーの型も混在してよい。

配列・連想配列のサイズ

count()関数の引数に配列や連想配列を指定して、サイズを取得する。

count(配列・連想配列)

配列・連想配列の存在確認

配列の要素を削除する

配列や連想配列の要素を削除する方法はこちら

配列の先頭・末尾・部分配列

破壊的な抜き取り・追加

配列要素の抜き取り・追加にはshift()/unshift()push()/pop()を使う。それらの方法はここちら

非破壊的な取出し

非破壊的に配列や連想配列の先頭・末尾・部分配列を取り出す方法はこちらを参照

配列の代入はディープコピー

1次元配列を代入すると、参照ではなく新たな配列としてコピーされる。

多次元配列の子要素の内容までコピーされる。

配列と連想配列

配列と連想配列の関係

  • PHPの配列と連想配列は同じもの
  • 連想配列のキーが整数のみで連続しているものが配列
  • 連想配列も配列も値の型は混在可能
  • 連想配列のキーも型の混在が可能

2つの配列から連想配列をつくる

array_combine()関数は2つの配列を引数にとり、第1引数をキー、第2引数を値とした連想配列を返す。

第2引数に連想配列を指定すると、その値が取り出されて使われる。配列を要素とする連想配列にはならない。

2次元の連想配列から列を取り出す

array_column()関数は2つの引数をとり、第1引数に指定した2次元の連想配列から第2引数で指定したキーの列を取り出す。

配列の操作

 

PHP – 演算

代数演算

+, -, *, **
加算/減算/乗算/べき乗。2つの項ともintの場合は結果もint。少なくとも1つの項がfloatの場合は結果もfloat。
/
除算。2つの項がintで割り切れる場合のみ結果もint。その他の場合結果はfloat。
intdiv(a, b)
a/bの整数商。結果の正負に関わらず、小数部分が切り捨てられる。
%
剰余。結果の符号は被除数の符号と同じになる。

文字列演算

.
文字列の結合。
.=
文字列の結合代入。左辺の引数に右辺の引数を追加する。

三項演算子

cond ? true_value : false_value
三項演算子は条件式condが真の時にtrue_valueを、偽の時にfalse_valueを返す。

null合体演算子

eval ?? null_value
null合体演算子は、条件式evalの評価結果nullでないときはその評価結果を、nullの場合はnull_valueを返す。

 

PHP – 導入

Windowsの場合

ダウンロード&インストール

PHP公式サイトのDonloadsから必要なファイルをダウンロード(Windowsの場合は”Windows downloadsから)。

パスの設定

設定から環境変数PATHにPHPフォルダーへのパスを追加。

php.ini

php.iniファイルの準備

PHPフォルダーにあるphp.ini-developmentかphp.ini-productionのどちらかをphp.iniにコピー。

必要なモジュールの有効化

マルチバイト文字列操作mbstring、SQL用のmysqliなどのコアモジュールでも、インストール直後には有効化されていない。

コアモジュールはPHPフォルダー下のextフォルダーにdllファイルとして納められている。

有効化するにはphp.iniファイルで以下の作業が必要。

  1. ;extension=mbstringなどとコメントアウトされているモジュールの行のコメントを外す
  2. ;extension_dir = “ext”とコメントアウトされている行のコメントを外す

参考:PHP 拡張モジュールの Windows へのインストール

サーバーの起動

php -S localhost:8000 -t [PHPのhtdocsのパス]

その他

参考:Windowsでのおすすめの構成