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環境を設定するための手順

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開発は可能です。しかし、コーディング効率を考えれば、一般的にはコードエディタを導入します。

開発環境のセットアップ方法

1、XAMPPによる開発環境のセットアップ

XAMPP(ザンプ)による開発環境が一番手軽にはじめることができます。XAMPPにはApache、PHP、MariaDBが含まれています。

2、Visual Studio Codeインストール

PHPでコーディングをする際に必要となる高機能コードエディターです。

PHPはインタプリター型の言語

インタプリター型の言語では実行都度にコンパイル及び実行します。一般的にコンパイル型よりもインタプリタ型の方が処理速度が劣りますが、PHPの最新のバージョンではパフォーマンスを向上させていますので、一般的な用途で速度がボトルネックになることはありません。また、PHP8では、JIT(Just-In-Time)機能を搭載しました。JIT機能とは、ソースコードを都度コンパイルするのではなく、内部的に一括コンパイルします。一括コンパイルされたコードはメモリ上に保存され、再利用されるので実行効率が大幅に改善しています。

スクリプトブロックが.phpファイルの末尾で終わる場合、スクリプトの終了を表す「?>」を省略できますが、その後方に改行や空白があると、これがブラウザーにも出力されてしまい、レイアウトがズレる原因にもなります。

文字列を簡単に出力する省略構文

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(改行)」を意味しています。

プラットフォーム改行コード
WindowsCR+LF
macOS/UnixLF

改行コードが異なるとエディターで開いた時にレイアウトが崩れたりするので、PHPでは改行コードは「LF」に統一しておきます。

改行コードをファイル単位で変更するのは、大変なのでsettings.jsonでプロジェクト既定の改行コードをあらかじめ設定できます。設定ファイルは、アプリルート配下\.vscodeフォルダに保存されています。

{
 "files.encoding": "utf8",  既定の文字コード
 "files.eol": "\n",         既定の改行コード(\nはLFの意味)
}

定義済みの数学定数

PHPに組み込まれている定義済みに数学定数は、以下の通りです。バージョンが明記されていない定数は、PHP4.0.0以降で使用可能

定数説明
M_PI3.14159265358979323846パイ(円周率)
M_E2.7182818284590452354e(自然対数の低)
M_LOG2E1.4426950408889634074log_2e
M_LOG10E0.43429448190325182765log_10e
M_LN20.69314718055994530942log_e2
M_LN102.30258509299404568402log_e10
M_PI_21.57079632679489661923pi/2
M_PI_40.78539816339744830962pi/4
M_1_PI0.318309886183790671541/pi
M_2_PI0.636619772367581343082/pi
M_SQRTPI1.77245385090551602729sqrt(pi)
※PHP5.2.0以降
M_2_SQRTPI1.128379167095512573902/sqrt(pi)
M_SQRT21.41421356237309504880sqrt(2)
M_SQRT31.73205080756887729352sqrt(3)
※PHP5.2.0以降
M_SQRT1_20.707106781186547524401/sqrt(2)
M_LNPI1.14472988584940017414log_e(pi)
※PHP5.2.0以降
M_EULER0.57721566490153286061オイラー定数
※PHP5.2.0以降
PHP_ROUND_HALF_UP1端数を切り上げる
※PHP5.3.0以降
PHP_ROUND_HALF_DOWN2端数を切り捨てる
※PHP5.3.0以降
PHP_ROUND_HALF_EVEN3端数を偶数に丸める
※PHP5.3.0以降
PHP_ROUND_HALF_ODD4端数を奇数に丸める
※PHP5.3.0以降
NANNAN(flat)非数値
INFINF(float)無限

デバック方法

VSCode+PHP Debug拡張によるデバックする方法

PHP入門

基本的なPHPアプリの作成方法

演算子

演算子の優先順位

PHPでは、すべての演算子に対して優先順位が決められています。1つの式の中に複数の演算子がある場合、PHPは優先順位が高い順に演算します。

複雑な式を書くときは、丸括弧を利用することで演算子の優先順位を明確にします。

5*3+4*12 →(5*3)+(4*12)

優先順位の番号小さい方が高い

優先順位演算子
1clone、new
2**
3++、–、~、(int)、(float)、(string)、(array)、(object)、(bool)、@
4instanceof
5!
6*、/、%
7+、-、.
8<<、>>
9<、<=、>、>=
10==、!=、===、!==、<>、<=>
11$
12^
13|
14&&
15||
16??
17?:
18=、+=、-=、*=、/=、**=、.=、%=、&=、|=、^=、<<=、>>=、??=
19and
20xor
21or

結合則

結合則は、優先順位の同じ演算子が並んでいる場合には、演算子を左から右、右から左のいずれの方向に処理するか決めるルールです。

例えば、次の式は等価になります。「+」、「-」演算子の優先順位は同じで、かつ、左→右の結合則を持つので、左から順に処理がされます。

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での設定やインストール時に明示的な組み込みを必要とするものがあります。

文字列関数

文字列関数は、文字列の加工や整形、部分文字列の検索/取得など、文字列の操作に広く関わる機能を提供します。文字列関数には、標準の文字列関数と日本語に対応したマルチバイト文字列関数があります。

数学関数

配列関数

配列関数は、配列に対して要素を追加/削除したり、配列要素を並べ替えたりと、配列に対する操作全般を行う関数です。

正規表現関数

正規表現(Regular Expression)とは「あいまいな文字列パターンを表現するための記法」です。正規表現を利用すれば、正規表現パターンと比較対象の文字列を指定するだけで、あとは両者が合致するかどうか正規表現エンジンが判定してくれます。

ファイルシステム関数

ファイルシステム関数は、ファイルシステム上のフォルダーやファイルを走査するための関数です。フォルダー/ファイルの情報を取得する、ファイルへの書き込みを行うなどの機能を提供します。

テキストファイルへの書き込み

例:アクセスログ情報をタブ区切りテキストの形式でテキストファイルに書き込むコード

<?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 'アクセスログを記録しました。';
実行結果
実行結果
access.log
access.log

アクセス時の情報を取得するコード

取得する値コード
アクセス日時data(‘Y/m/d H:i’)
アクセスしたスクリプトのパス$_SERVER[‘SCRIPT_NAME’]
クライアントの種類$_SERVER[‘HTTP_USER_AGENT’]
リンク元のアドレス$_SERVER[‘HTTP_REFERER’]

ファイル書き込みの基本手順

  • ファイルを開く
  • ファイルをロックする
  • ファイルに対して書き込みを行う
  • ファイルを閉じる(ロック解除)
ファイルシステム関数の設定パラメーター

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);

データベース

データベース製品は、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
MariaDB専用ドライバーは存在しません。MariaDBはMySQL互換のデータベースです。PDOからも、従来のMySQLドライバーで接続できます。SQLServerやDB2も対応していますが、それぞれのサイトからダウンロードする必要があります。