オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。最終回は、クラスの論理的な入れ物である名前空間とクラスを自動的に読み込むオートロードを解説します。
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載「Web業界で働くためのPHP入門」。今回は、いよいよ最終回です。クラスの論理的な入れ物である名前空間とクラスを自動的に読み込むオートロードを解説します。
「名前空間」とは、クラスの論理的な入れ物です。JavaやC#などは古くから名前空間をサポートしていますが、PHPではバージョンが5.3になってから導入されました(Javaの場合はパッケージと呼ばれます)。そのため、5.3以前から存在する多くのライブラリなどでは名前空間を導入していません。では、名前空間というのはどういった機能でしょうか。その名前空間が必要な理由から話を始めましょう。
例えば、以下のような2ファイルがあるとします。
<?php class OrderAdmin { public function __construct() { print("businesses/OrderAdminがnewされました<br>"); } }
<?php class OrderAdmin { public function __construct() { print("consumers/OrderAdminがnewされました<br>"); } }
これら2ファイルは、それぞれB2B向けの注文管理クラスとB2C向けの注文管理クラスを表しているとします。注文対象が違うとしても、同じ注文管理なので、クラス名が同じ「OrderAdmin」であり、それに伴ってファイル名も同じOrderAdmin.phpです。ただし、そのファイルが存在するパスが違います。
なお、中の処理は何でも構いません。ここではコンストラクタのみを記述しています。
この状態で、以下のphpファイルを実行したとします。これは、B2B向けの注文管理クラスとB2C向けの注文管理クラスを同時に使いたいケースを想定しています。
<?php require_once("classes/businesses/OrderAdmin.php"); // (1) require_once("classes/consumers/OrderAdmin.php"); // (2) $orderAdmin = new OrderAdmin(); // (3)
実行結果は以下のようにエラーとなります。
Fatal error: Cannot declare class OrderAdmin, because the name is already in use in C:\xampp\htdocs\phplesson\chap20\classes\consumers\OrderAdmin.php on line 2
これは、どういったエラーなのでしょうか。
リスト3は(1)と(2)でリスト1とリスト2の2ファイルを読み込んでいます。先に説明したように、これら2ファイルは、パスと処理内容は異なりますが、クラス名は同じです。PHPでは、同じクラス名のクラスを複数読み込んだ場合、どのクラスを採用したらいいのか分からなくなるため、エラーとなります。エラー文面もそのことを表しています。
なお、このエラーはクラスファイルを読み込んだ時点で発生するので、リスト3の(3)の行がなくてもエラーとなることには留意しておいてください。
このように、中の処理は違うが同じ名前のクラスを1つの実行phpファイルで使いたいケースはあり得ます。これが使う以前の読み込み段階でエラーとなるのは困るので、回避する必要があります。
このエラーを回避する方法として、まず思い付くのはクラス名を、例えば、BusinessOrderAdminとConsumerOrderAdminのように、全て別のものにすることです。こちらは有効ですが、クラス数が多くなると限界があります。
そこで、登場するのが「名前空間」です。これは、ファイルパスとは別に、クラスそのものを入れておく論理的な入れ物のことです。例えるなら、クラスが存在する部屋です。
Copyright © ITmedia, Inc. All Rights Reserved.