PHPを学び始めると、誰もが最初に出会うのが「.php」というファイルの拡張子です。
.htmlではダメなのか?」「
.phpとは、具体的にどのような意味を持つファイルなのか?」このような疑問を持つ方も多いかもしれません。
また、開発を進めていくと、今度は「アップロードされたファイルの拡張子を、PHPのコードで取得・判定したい」という、逆の技術的な課題にも直面します。
そこでこの記事では、「.php」という拡張子の基本的な意味から、PHPのプログラム内でファイルの拡張子を安全に取得・操作する具体的なテクニックまでわかりやすく徹底解説します。
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
| 大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
| 月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
| 格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
| 完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
| 長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
PHPの拡張子「.php」とは?
まず、拡張子とはファイルの種類を識別するための、ファイル名の末尾につけられる文字列のことです。
例えば.txtならテキストファイル、.jpgなら画像ファイルといった具合です。
その中で「.php」という拡張子は、「このファイルにはPHPのコードが含まれているので、サーバー側で実行してください」という、Webサーバーに対する特別な指示を意味します。
.htmlファイルとの決定的な違い
.htmlファイルと.phpファイルの最大の違いは、「サーバーがそのファイルをどう扱うか」にあります。
【.htmlファイル(静的)】
- ブラウザが「sample.html」を要求する。
- サーバーは「はい、どうぞ」と、
sample.htmlに書かれている内容(HTMLコード)をそのままブラウザに送信する。 - ブラウザがHTMLコードを解釈してページを表示する。
【.phpファイル(動的)】
- ブラウザが「sample.php」を要求する。
- サーバーは「
.phpだ」と認識し、ファイルの中身をPHPの実行エンジン(インタプリタ)に渡す。 - PHPの実行エンジンがファイル内の
<?php ... ?>の部分を実行し、データベースに接続したり、計算したり、if文で表示内容を変えたりする。 - 実行結果として最終的に生成されたHTMLコードだけを、サーバーに返す。
- サーバーは、その「実行結果のHTML」をブラウザに送信する。
- ブラウザは、最初から
.htmlファイルが送られてきたかのようにページを表示する。
つまり、ブラウザ(閲覧者)側から見れば、送られてくるのはどちらも同じHTMLコードです。
しかし、.phpファイルは、そのHTMLを生成するためにサーバー側でプログラムが一度「実行」されている、という決定的な違いがあるのです。
PHPファイルが動く仕組み
前述の通り、「サーバー側で実行される」という点が非常に重要です。
閲覧者が自分のPCで.phpファイルを直接開こうとしても、<?php echo "こんにちは"; ?>といったコードが書かれたテキストファイルとして開かれるだけで、Webページとしては表示されません。
.phpファイルは、ApacheやNginxといったWebサーバーと、PHPの実行エンジンがインストールされたサーバー環境にアップロードされて初めて、その真価を発揮するのです。
.php3や.phtmlといった古い拡張子
歴史的な経緯で、過去には.php3(PHP 3の時代)や.phtmlといった拡張子が使われていたこともありました。
しかし現在では、これらを新規に利用する理由はまったくありません。
PHPのファイルを作成する際は、特別な理由がない限り「.php」という拡張子に統一するのが標準的なルールです。
PHPで拡張子を取得・操作する実践テクニック
ここまでは「.phpとは何か」という概念的な話でした。
ここからは視点を変えて、「PHPのプログラムコードの中で、あるファイルパスの拡張子を取得・操作する方法」について解説します。
ファイルアップロード機能の実装や、特定のファイル形式だけを処理したい場合に必須のテクニックですので、是非参考にしてください。
最も簡単で安全な方法: pathinfo()
PHPで拡張子を取得する場合、最も標準的で安全な方法が、組み込み関数のpathinfo()を使うことです。
pathinfo()は、ファイルパスの文字列を解析し、「ディレクトリ名」「ベース名」「ファイル名」「拡張子」に分解してくれます。
pathinfo()の基本的な使い方
拡張子だけが欲しい場合は、第二引数にPATHINFO_EXTENSIONを指定するのが最も簡単です。
<?php
$filepath = 'path/to/my-document.txt';
// 拡張子だけを文字列として取得
$ext = pathinfo($filepath, PATHINFO_EXTENSION);
echo $ext;
?>
実行結果は以下の通りです。
txt
pathinfo()の注意点(重要な落とし穴)
pathinfo()は非常に優秀ですが、いくつかの特徴的な挙動があります。
これを知らないとバグの原因になるため注意しましょう。
- 拡張子がないファイル
READMEのように拡張子がないファイルパスを渡すと、空文字列""が返ります。 - ドットから始まるファイル(.htaccessなど) .htaccessのようにドットで始まるファイルの場合、pathinfo()はドット以降の部分(この例では”htaccess”)を拡張子として返します。これは意図しない挙動になる可能性があるため注意が必要です。
<?php
// 拡張子がない
$ext1 = pathinfo('README', PATHINFO_EXTENSION);
var_dump($ext1);
// ドットから始まる
$ext2 = pathinfo('.htaccess', PATHINFO_EXTENSION);
var_dump($ext2);
?>
実行結果は以下の通りです。
string(0) ""
string(9) "htaccess"
すべての情報を連想配列で取得する
第二引数を省略すると、パスに関するすべての情報が連想配列で返されます。
<?php
$filepath = 'archive/document.ver2.pdf';
$info = pathinfo($filepath);
print_r($info);
?>
実行結果は以下の通りです。
Array
(
[dirname] => archive
[basename] => document.ver2.pdf
[extension] => pdf
[filename] => document.ver2
)
dirname: ディレクトリ名basename: ファイル名(拡張子含む)extension: 拡張子filename: ファイル名(拡張子なし)
filenameが、最後の.pdfだけを除いたdocument.ver2になっている点がポイントです。
オブジェクト指向で扱う: SplFileInfo
DirectoryIteratorなどでディレクトリ内のファイルを操作している場合など、すでにファイルがオブジェクトとして扱われている場合は、SplFileInfoクラスのgetExtension()メソッドを使うのがスマートです。
<?php
// SplFileInfoオブジェクトを作成
$file = new SplFileInfo('image.thumbnail.jpg');
// getExtension()メソッドで拡張子を取得
$ext = $file->getExtension();
echo $ext;
?>
実行結果は以下の通りです。
jpg
内部的にはpathinfo()と同じロジックで動いていますが、オブジェクト指向のコードの中ではこちらの方が馴染みやすいでしょう。
自力で分割する危険性
「ドット.で文字列を分割して、最後の要素を取り出せば良いのでは?」と考えるかもしれません。
<?php
// やってはいけない例
$filepath = '.htaccess';
$parts = explode('.', $filepath);
$ext = end($parts);
echo $ext; // 'htaccess' と表示されてしまう
?>
この方法は一見動くように見えますが、先ほどの.htaccessの例ではhtaccessが拡張子として誤って取得されてしまいます。
READMEのような拡張子なしファイルでも、README自身が返ってきてしまうのです。
このようなケースに対応できないため、explode()で拡張子を取得しようとするのは避け、必ずpathinfo()を使いましょう。
拡張子をチェックする実践的なコード例
最後に、pathinfo()を使った最も一般的なユースケースとして、「ファイルアップロード時に、許可された拡張子かどうかを判定する」コード例を紹介します。
ファイルアップロードで特定の拡張子か判定する
<?php
// ユーザーがアップロードしたファイル名(実際は $_FILES['user_file']['name'] などから取得)
$filename = 'Upload-Image.JPG';
// 許可する拡張子のリスト(必ず小文字で定義しておく)
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
// 1. pathinfo()で拡張子を取得
$ext = pathinfo($filename, PATHINFO_EXTENSION);
// 2. 取得した拡張子を小文字に変換(大文字・小文字を区別しないため)
$ext_lower = strtolower($ext);
// 3. 許可リストに存在するかチェック
if (in_array($ext_lower, $allowed_extensions)) {
echo "{$ext_lower} は許可されたファイル形式です。";
} else {
echo "{$ext_lower} は許可されていません。";
}
?>
実行結果は以下の通りです。
jpg は許可されたファイル形式です。
このコードの重要なポイントは、pathinfo()で取得した拡張子をstrtolower()で一度すべて小文字に変換している点です。
ユーザーがIMAGE.JPGのように大文字でアップロードしてきても、小文字のjpgとして正しく判定できます。
まとめ
以上、「php 拡張子」というキーワードが持つ2つの意味について、網羅的に解説しました。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。




