PHP入門
PHP(PHP:HypertextPreprocessor)サーバーサイドで動作するスクリプトの実行環境です。
特徴
習得が容易である
文法がシンプルで、初心者にも習得が簡単です。
ドキュメントが充実している
公式ドキュメントが充実しており、増大な命令1つ1つについて、構文と用例が日本語できちんと紹介されている。
利用環境が豊富
PHPは、WindowsやmacOS、Unix(Linux)をはじめとした代表的なプラットフォームで実行できます。
PHPの歴史
PHPのルーツは、Perlスクリプトで書かれたCGI(Common Gateway interface)のラッパー(ユーティリティ)です。その後、パフォーマンスを改善する目的で、すべてのコードをC言語で書き直したものが、1994年に「PHP(Personal Homepage Tools)1.0」としてリリースされます。その後、PHP1.0はデータベースへのアクセス機能や、フォームを解釈するFI(Form Interpreter)を付け加え、1995年、PHP/FI2.0と呼ばれるようになります。PHP/FI2.0はそれまでの建て増しに次ぐ建て増しで、安定性や保守性という意味で問題がありました。そこで、本格的にコードの書き換え作業が始まります。その結果として1998年に登場したPHP3.0は、現在のPHPの元祖なるバージョンとなりました。名称が「Personal Homepage Tools」から「PHP:Hypertext Preprocessor」に改められたものこの時期です。PHP/FI2.0と互換性はありませんが、コードを全面的に書き直したことから、パフォーマンスも安定性も大幅に向上しました。また、国際化対応バージョンが登場したことで、日本国内の利用者も増えました。
その後、2000年リリースのPHP4を経て、2004年7月にリリースされたのがPHP5です。バージョン5では、コアエンジンである「Zend Engine」が2.0にバージョンアップされたことで、基本機能にもさまざまな変更/強化が加えられました。その中でも注目すべき点がオブジェクト指向構文の強化でようやくPHPでもJavaライクな本格的なオブジェクト指向開発が可能になりました。その後、PHP5.1ではデータベース抽象化レイヤPDOが追加され、PHP5.3では名前空間/クロージャー、PHP5.4ではトレイト、PHP5.5ではジェネレータが、それぞれ実装されました。
公式サイト
- PHP(https://www.php.net/)
- PHPマニュアル(https://www.php.net/manual/ja/index.php)
PHP環境を設定するための手順
PHPでアプリケーションを開発・実行するには以下のソフトウェアが必要です。
1、Webサーバ-(Apache HTTP Server)
PHPはクライアントから要求を受けてからなんらかの処理を行うサーバーサイドのスクリプト実行環境です。PHPが動作するためには、クライアントからの要求をPHPに振り分けて、PHPでの実行結果をクライアントに応答するためのWebサーバ-が必要となります。Webサーバ-には、Windowsの標準的なサービスでもあるIIS(Internet Information Services)やnginx、ApacheHTTPServerなどあります。
2、PHP(PHP:Hypertext Preprocessor)
PHPの本体です。PHPの実行エンジンや各種ライブラリ、設定ファイルのテンプレートなど、PHPアプリの開発・実行に必要な一連のソフトウェアを含んだものになります。
3、データベースサーバー(MariaDB)
PHPアプリの開発において、データベースサーバーは必須ではありませんが、大量のデータを高速かつ確実に処理するにはデータベースサーバーが必要です。
4、コードエディター
PHPでコードを編集するために必要となります。Windows標準の「メモ帳」やmacOS標準の「テキストエディット」でもPHP開発は可能です。しかし、コーディング効率を考えれば、一般的にはコードエディタを導入します。
- Visual Studio Code(https://code.visualstudio.com)
- Atom(https://atom.io)
- Sublime Text(https://www.sublimetext.com/)
開発環境のセットアップ方法
XAMPP(ザンプ)による開発環境が一番手軽にはじめることができます。XAMPPにはApache、PHP、MariaDBが含まれています。
PHPでコーディングをする際に必要となる高機能コードエディターです。
PHPはインタプリター型の言語
インタプリター型の言語では実行都度にコンパイル及び実行します。一般的にコンパイル型よりもインタプリタ型の方が処理速度が劣りますが、PHPの最新のバージョンではパフォーマンスを向上させていますので、一般的な用途で速度がボトルネックになることはありません。また、PHP8では、JIT(Just-In-Time)機能を搭載しました。JIT機能とは、ソースコードを都度コンパイルするのではなく、内部的に一括コンパイルします。一括コンパイルされたコードはメモリ上に保存され、再利用されるので実行効率が大幅に改善しています。
文字列を簡単に出力する省略構文
PHPでは単純な値を出力する場合に、<?php~?>の代わりに、<?=~?>という構文を用意しています。
<?='こんにちは、みなさん'?><br />
<?='こんにちは、みなさん'?>
文を区切るのはセミコロン(;)
PHPでは複数の文を区切るのに、;(セミコロン)を使う必要があります。
print 'こんにちは、みなさん<br />';
print 'こんにちは、山田さん<br />';
セミコロンは文と文の区切りを表します。1つの文が長い場合は、以下のように空白や改行を行っても問題ありません。ただし、コードの可読性が落ちるので、次のコーディング規約を設けると良いでしょう。
print
'こんにちは、山田さん<br />'
;
- 文が80行を超えた場合に改行
- 改行位置はカンマ(,)、演算子などの直後
- 文の途中で改行したい場合には、次の行にインデックスを加える
- 短い文でも、複数の文を1行にまとめない(ブレークポイント対策)
大文字/小文字は区別しない
PHPでは命令の大文字/小文字を区別しません。
コメント
コメントはエンドユーザーには表示されませんので、開発者だけのメモとして使用することができます。
単一行のコメント
単一行のコメントは、「//」または「#」から行末までをコメントと見なします。ただし、「#」はほとんど使うことはありませんので、「//」で統一します。
//コメント
複数行のコメント
「/**/」で囲まれたブロック全体をコメントとみなします。複数行のコメントには入れ子にすることはできません。
/*
print 'コメントアウト1';
print 'コメントアウト2';
*/
/*単一行にも使用できる*/
PHPはHTML埋め込み型言語
PHPでは、HTMLコードの中に<?php~?>というブロックを埋め込み、その中に自由に命令文を記述できるからです。<?php~?>のことを、HTMLコードとPHPスクリプトとの境を表す区切り文字(デリミター)という意味で、スクリプティングデリミターまたはPHPタグと呼びます。
PHPのファイル名について
Apacheは、拡張子が「.php」であるファイルが要求されたタイミングでPHPの実行エンジンを起動します。ファイル名については、シングルバイト文字(英数字やハイフン、アンダースコア)にします。日本語のようなマルチバイト文字を指定してはいけません。
文字コードの設定
PHPを利用するにあたっては、php.iniで実際使っている文字コードを宣言する必要があります。基本的には国際化対応にもすぐれた性質を持っているUTF-8でシステム全体を統一するのが好ましいです。
UTF-8の設定
VSCodeでは、そもそも標準の文字コードがUTF-8になっています。確認方法は、ステータスバーの表示を確認します。
文字コードを変更することもできます。文字コード(❶)をクリックします。
エンコード付きで保存(❷)。
文字コードを選択します(➌)。このとき、「UTF-8 with BOM」(BOM付きUTF-8)を選択してはいけません。BOMは「Byte Order Mark」の略で、Unicode形式の先頭に付与される数バイトのデータのことです。BOMを利用することで、そのテキストがUnicodeで記述されていること、また、その種類(UTF-8、UTF-16)を識別します。しかし、このBOMはUnicodeを扱う上で必須ではないばかりでなく、PHPではそもそもBOM付きのファイルを正しく処理できない場合があります。
改行コードの設定
改行コード(改行文字)は、行を折り返すための特殊文字です。CRは「Carriage Ruturn(復帰)」、LFは「Line Fedd(改行)」を意味しています。
プラットフォーム | 改行コード |
---|---|
Windows | CR+LF |
macOS/Unix | LF |
改行コードが異なるとエディターで開いた時にレイアウトが崩れたりするので、PHPでは改行コードは「LF」に統一しておきます。
改行コードをファイル単位で変更するのは、大変なのでsettings.jsonでプロジェクト既定の改行コードをあらかじめ設定できます。設定ファイルは、アプリルート配下\.vscodeフォルダに保存されています。
{
"files.encoding": "utf8", 既定の文字コード
"files.eol": "\n", 既定の改行コード(\nはLFの意味)
}
定義済みの数学定数
PHPに組み込まれている定義済みに数学定数は、以下の通りです。バージョンが明記されていない定数は、PHP4.0.0以降で使用可能
定数 | 値 | 説明 |
---|---|---|
M_PI | 3.14159265358979323846 | パイ(円周率) |
M_E | 2.7182818284590452354 | e(自然対数の低) |
M_LOG2E | 1.4426950408889634074 | log_2e |
M_LOG10E | 0.43429448190325182765 | log_10e |
M_LN2 | 0.69314718055994530942 | log_e2 |
M_LN10 | 2.30258509299404568402 | log_e10 |
M_PI_2 | 1.57079632679489661923 | pi/2 |
M_PI_4 | 0.78539816339744830962 | pi/4 |
M_1_PI | 0.31830988618379067154 | 1/pi |
M_2_PI | 0.63661977236758134308 | 2/pi |
M_SQRTPI | 1.77245385090551602729 | sqrt(pi) ※PHP5.2.0以降 |
M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(pi) |
M_SQRT2 | 1.41421356237309504880 | sqrt(2) |
M_SQRT3 | 1.73205080756887729352 | sqrt(3) ※PHP5.2.0以降 |
M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2) |
M_LNPI | 1.14472988584940017414 | log_e(pi) ※PHP5.2.0以降 |
M_EULER | 0.57721566490153286061 | オイラー定数 ※PHP5.2.0以降 |
PHP_ROUND_HALF_UP | 1 | 端数を切り上げる ※PHP5.3.0以降 |
PHP_ROUND_HALF_DOWN | 2 | 端数を切り捨てる ※PHP5.3.0以降 |
PHP_ROUND_HALF_EVEN | 3 | 端数を偶数に丸める ※PHP5.3.0以降 |
PHP_ROUND_HALF_ODD | 4 | 端数を奇数に丸める ※PHP5.3.0以降 |
NAN | NAN(flat) | 非数値 |
INF | INF(float) | 無限 |
デバック方法
PHP入門
演算子
演算子の優先順位
PHPでは、すべての演算子に対して優先順位が決められています。1つの式の中に複数の演算子がある場合、PHPは優先順位が高い順に演算します。
複雑な式を書くときは、丸括弧を利用することで演算子の優先順位を明確にします。
5*3+4*12 →(5*3)+(4*12)
優先順位の番号小さい方が高い
優先順位 | 演算子 |
---|---|
1 | clone、new |
2 | ** |
3 | ++、–、~、(int)、(float)、(string)、(array)、(object)、(bool)、@ |
4 | instanceof |
5 | ! |
6 | *、/、% |
7 | +、-、. |
8 | <<、>> |
9 | <、<=、>、>= |
10 | ==、!=、===、!==、<>、<=> |
11 | $ |
12 | ^ |
13 | | |
14 | && |
15 | || |
16 | ?? |
17 | ?: |
18 | =、+=、-=、*=、/=、**=、.=、%=、&=、|=、^=、<<=、>>=、??= |
19 | and |
20 | xor |
21 | or |
結合則
結合則は、優先順位の同じ演算子が並んでいる場合には、演算子を左から右、右から左のいずれの方向に処理するか決めるルールです。
例えば、次の式は等価になります。「+」、「-」演算子の優先順位は同じで、かつ、左→右の結合則を持つので、左から順に処理がされます。
5 + 7 -1 ⇔ (5 + 7) -1
右→左(右結合)の結合則を持つのは、代入演算子、否定(!)演算子などです。次の式は等価になります。「=」「+=」演算子は優先順位が等しく、かつ、右結合なので、右のオペランドから順に処理が行われます。
$b = $a += 1 ⇔ $b = ( $a += 1)
結合性 | 演算子の種類 | 演算子 |
---|---|---|
左結合 | 算術演算子 | *、/、%、+、- |
ビット演算子 | <<、>>、&、^、| | |
論理演算子 | &&、||、and、xor、or | |
条件演算子 | ?: | |
その他 | .(文字列演算子)、instanceof | |
右結合 | 算術演算子 | ** |
論理演算子 | ! | |
代入演算子 | =、+=、-=、*=、/=、**=、.=、%=、&=、|=、^=、<<=、>>=、??= | |
その他 | clone、~、??、(int)、(float)、(string)、(array)、(object)、(bool)、@ | |
非結合 | 比較演算子 | <、<=、>、>=、<>、==、!=、===、!==、<=> |
その他 | new、++、– |
非結合
比較演算子などがこの性質を持ちます。非結合とは、「結合しない」という意味で、同じ優先順位で非結合の性質を持つ演算子を並べた場合はエラーになります。
$a == $b == $c
制御構文
スクリプトブロックと固定テンプレート
スクリプティングデリミタ(<?php~?>)で囲まれたスクリプトブロックに対して、固定的なHTMLソースのことを固定テンプレートまたはHTMLテンプレートと呼びます。スクリプトブロックと固定テンプレートとは、入れ子に記述することも可能です。
<?php for($i = 1; $i <6; $i++){ ?>
<p>ハロー世界</p>
<?php } ?>
制御命令の別構文
if、switch、while、for、foreach命令には、別の構文が存在します。中カッコ({~})の代わりに、開始の中カッコをコロン(:)、終了の中カッコを「endif:」「endswitch:」「endwhile:」「endfor:」「endforeach:」のいずれかにする構文です。
<?php
$x = 35;
if($x > 20):
print '変数$xは20より大きいです。';
elseif($x > 10):
print '変数$xは10より大きく、20以下です。';
else:
print '変数$xは10以下です。';
endif;
組込み関数
PHPでは、最初から関数が豊富に用意されています。関数を利用することでやりたいことを直感的に記述できます。
関数の基本
関数の呼び出し
構文:関数の呼び出し
戻り値 = 関数名(引数, ・・・)
$file = fopen('access.log','a'); //引数が複数ある場合
$today = time(); //引数がない場合
closedir($dir); //戻り値がない場合
組込み関数
PHPが標準で提供する関数のことを組み込み(ビルトイン)関数または内部関数と言います。組込み関数には、特に準備が不要で使用できるコマな関数の他、利用にあたりphp.iniでの設定やインストール時に明示的な組み込みを必要とするものがあります。
文字列関数
文字列関数は、文字列の加工や整形、部分文字列の検索/取得など、文字列の操作に広く関わる機能を提供します。文字列関数には、標準の文字列関数と日本語に対応したマルチバイト文字列関数があります。
- 文字列の長さを取得する(mb_strlen関数)
- 文字列を大文字、小文字で変換する(mb_convert_case)
- 部分文字列を取得する(mb_substr)
- 部分文字列を取得する(mb_strstr)
- 文字列関数 部分文字列を置換する(str_replace)
- 文字列を特定の区切り文字で分割する(explode)
- 特定の文字位置を検索する(mb_strpos/mb_strrpos)
- 部分文字列の登場回数をカウントする(mb_substr_count)
- 文字列に特定の文字列が含まれるかを判定する(str_contains/str_starts_with/str_ends_with)
- 文字列の前後から空白を除去する(trim/ltrim/rtrim関数)
- 文字列を整形する(printf)
- 文字列を変換する(mb_convert_kana)
- 文字エンコーディングする(mb_convert_encoding)
- 電子メールを送信する(mb_send_mail)
数学関数
- 数値の絶対値を取得する(abs)
- 円周率の値を取得する(pi)
- 三角関数を取得(sin/cos/tan)
- 度単位とラジアン単位を相互に変換する(deg2rad/rad2deg関数)
- 直角三角形の斜辺の長さを計算する(hypot)
- べき乗や平方根を計算する(pow/sqrt)
- 数値の基数を変換する(base_convert、decbin、decoct、dechex、bindec、octdec、hexdec)
- 端数の切り上げ/切り捨てを行う(ceil/floor)
- 浮動小数点を丸める(round)
- eの累乗を計算する(exp)
- 対数を計算する(log/log10)
- 割り算の余りを求める(fmod)
- 乱数を生成する(rand/mt_rand/lcg_value)
- 乱数の最大値を取得する(getrandmax/mt_getrandmax)
- 最大値/最小値(max/min)
- 任意の精度で数値の演算を行う(bcadd、bccomp、bcdiv、bcmod、bcmul、bcpow、bcpowmod、bcscale、bcsqrt、bcsub)
- 変数のデータ型を判定する(is_xxxxx関数)
- 変数を破棄する(unset)
配列関数
配列関数は、配列に対して要素を追加/削除したり、配列要素を並べ替えたりと、配列に対する操作全般を行う関数です。
- 配列の要素数を取得する(count)
- 要素の登場回数をカウントする(array_count_values)
- 配列の内容を連結する(array_merge)
- 配列の各要素を結合する(implode)
- 配列の先頭/末尾に要素を追加/削除する(PHP入門 配列関数 配列の先頭/末尾に要素を追加/削除する(array_push/array_pop/array_shift/array_unshift関数)
- 配列に複数要素を追加/置換/削除する(array_splice)
- 配列から特定範囲の要素を取得する(array_slice)
- 配列の内容を検索する(array_search)
- 配列に特定の要素存在するかを確認する(in_array)
- 配列の内容を並べ替える(sort/rsort/asort/arsort/ksort/krsort)
- 自作のルールで配列を並べ替える(usort)
- 配列の内容を順に処理する(array_walk)
- 配列内の要素を加工する(array_map)
- 配列の内容を特定の条件で絞り込む(array_filter)
- 配列内の要素を順に処理して1つにまとめる(array_reduce)
正規表現関数
正規表現(Regular Expression)とは「あいまいな文字列パターンを表現するための記法」です。正規表現を利用すれば、正規表現パターンと比較対象の文字列を指定するだけで、あとは両者が合致するかどうか正規表現エンジンが判定してくれます。
- 正規表現の基本
- 正規表現で文字列を検索する(preg_match)
- すべてのマッチ文字列を取得する(preg_match_all)
- 正規表現で文字列を置換する(preg_replace)
- 正規表現で置き換えたコールバック関数で処理する(preg_replace_callback)
- 正規表現で文字列を分割する(preg_split)
- PHP入門 正規表現関数 正規表現パターンの修飾子
- 正規表演による検索
ファイルシステム関数
ファイルシステム関数は、ファイルシステム上のフォルダーやファイルを走査するための関数です。フォルダー/ファイルの情報を取得する、ファイルへの書き込みを行うなどの機能を提供します。
テキストファイルへの書き込み
例:アクセスログ情報をタブ区切りテキストの形式でテキストファイルに書き込むコード
<?php
//書き込み内容を配列$dataにセット
$data[] = date('Y/m/d H:i:s');
$data[] = $_SERVER['SCRIPT_NAME'];
$data[] = $_SERVER['HTTP_USER_AGENT'];
//$data[] = $_SERVER['HTTP_REFERER'];
//access.logを追記書き込みモードでオープン
$file = @fopen('access.log','a') or die('ファイルを開けませんでした');
//ファイルをロック
flock($file, LOCK_EX);
//ファイルの書き込み
fwrite($file, implode("\t", $data) . "\n");
//ロックの解除
flock($file, LOCK_UN);
//ファイルのクローズ
fclose($file);
print 'アクセスログを記録しました。';
アクセス時の情報を取得するコード
取得する値 | コード |
---|---|
アクセス日時 | data(‘Y/m/d H:i’) |
アクセスしたスクリプトのパス | $_SERVER[‘SCRIPT_NAME’] |
クライアントの種類 | $_SERVER[‘HTTP_USER_AGENT’] |
リンク元のアドレス | $_SERVER[‘HTTP_REFERER’] |
ファイル書き込みの基本手順
- ファイルを開く
- ファイルをロックする
- ファイルに対して書き込みを行う
- ファイルを閉じる(ロック解除)
- ファイルを開く(fopen/fclose)
- fopen関数でのエラー処理(@、or、die関数)
- ファイルへの書き込み(fwrite)
- ファイルのロック(flock)
- タブ区切りテキストの読み込み(fgetcsv)
- タブ区切りテキストの読み込み(fgets/file関数)
ファイルシステム関数の設定パラメーター
PHPでは、ファイルシステム関数の挙動を制御するために、php.iniで設定可能ないくつかのパラメーターを用意しています。
allow_url_fopenパラメーター
fopen関数で読み込めるのは、サーバー上のファイルだけではありません。「http://~」や「ftp://~」で始まるアドレスも読み込むことができます。ただし、その場合は、allow_url_fopenパラメーターをOnに設定しておく必要があります。
open_basedirパラメーター
スクリプトからアクセスできるフォルダーを設定します。open_basedirパラメーターを指定した場合、スクリプトからはここで設定したフォルダーにしかアクセスできなくなります。(既定ではすべてのフォルダーへのアクセス許可をしています。)これによりスクリプトに脆弱性があった場合にも、予期せぬファイルにアクセスされてしまう危険性を最小化できます。複数のフォルダを指定した場合は、Windows環境ではセミコロン(;)、macOS環境ではコロン(:)でパスを区切ります。
opoen_basedir = "c:\data;c:\"
include_pathパラメーター
ドキュメントルートとは別にフォルダにアクセスしたい場合は、絶対パスを指定するのが大変なので、include_pathパラメーターにファイル検索先を設定します。
include_path = ".;c:\;c:\data"
ただし、fopen関数でinclude_pathを有効にするには、第3引数にtrueを指定します。
$file = fopen('access.log', 'r', true);
ユーザー関数
標準的な関数でカバーされていないような定型的な処理については、アプリ開発者が自分で定義することができます。このような関数をユーザー定義関数と言います。
標準クラスライブラリ
PHPでもオブジェクト指向プログラミングに対応したオブジェクト指向のライブラリ(クラスライブラリ)が多く提供されるようになっています。
リクエスト情報
データベース
データベース製品は、MySQL/MariaDBやPostgreSQLのようなオープンの製品からOracleやSQL Serverのような商用のデータベース、用途によってはAccessのような個人向け製品とさまざまあります。PHPからアクセスするのに、データベース製品ごとの仕様に合わせてプログラムを開発するのは至難の業です。そうした問題を解消するのが「データベース抽象化レイヤー」です。データベース抽象化レイヤーは、データベースごとに違いを吸収し、アプリがデータベースに対してアクセスを試みる際に、共通の手段を提供するものです。
PDO(PHP Data Object)
PHPには、さまざまデータベース抽象化レイヤーが用意されていますが、その中でも、お勧めはPDO(PHP Data Objects)です。PDOはオブジェクト指向構文にも完全対応しており、なんといっても標準で利用できるメリットがあります。※インストールなどの作業はありません。また、ネイティブに提供されているクラスなので、処理速度にも優れています。
XAMPPの初期設定
- MySQL
- MariaDB
- SQLite
- PostgreSQL(macのみ)
を利用できるようになっていますが、ドライバーを追加することで、その他のデータベースにも簡単に接続できます。ドライバーとは、個別のデータベースにアクセスするための直接の役割を担うライブラリです。それぞれのドライバーを有効にするには、php.iniから対応する行のコメント記号「;」を削除します。
php.ini
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
オブジェクト指向
- クラス定義(プロパティ定義、メソッド定義、コンストラクター、デストラクター、静的メソッド、静的プロパティ、クラス定数)
- カプセル化(アクセス修飾子、アクセサーメソッド)
- 継承
- ポリモーフィズム(抽象メソッド、インターフェース、instanceof演算子、無名クラス)
- トレイト(基本、多重継承、アクセサーメソッド、名前競合)
- オブジェクトの操作(オブジェクトの代入や比較、反復処理)
- マジックメソッド(__get/__set/__isset/__unset/__call/__callStatic/__toString/__invoke/__clone/__debuginfo)
- 名前空間(namespace、use)
- クラスの自動ローディング