インクルード・名前空間

目次
  • 解説
  • 1. インクルードとは
  • 2. namespace
  • 3. use
問題に挑戦!
進捗を変更する




解説

1. インクルードとは


FirstStep.php」の構造をひととおり学習しましたので、少し機能を追加してみましょう。PHPが用意してくれているプログラムを利用して、実行された日時も出力するようにします。

日時情報付きブラウザ出力メソッド作成手順

(1)php_basic」フォルダーの中に「utility」フォルダーを作成してください。
(2)utility」フォルダーの中に「Logger.php」を作成し、
次のサンプルコードのようにプログラムを書き込んで保存してください。
<?php 
// プログラムの定義
class Logger 
{
    /**
     * 実行すると日時データを付与してデータを出力します。
     */
    public static function echo($object) 
    {
        $now = date('[Y/m/d H:i:s]');
        echo $now . ' ' . $object . '<br>';
    }
}
(3)FirstStep.php」を次のサンプルコードのように書き換えて保存してください。
<?php

include './utility/Logger.php';

FirstStep::main();

class FirstStep
{
    public static function main()
    {
        Logger::echo('Hello!');
    }
}

ちょっと見慣れない形式ですが、別ファイルに定義したメソッドを使用することにより、「Hello!」の前に日時の情報が出力されるようになりました!

これはinclude文に目的のファイルまでのパスを指定することによって、別ファイルを読み込むことができ、そこに定義されているクラスやメソッドを利用できるようになるインクルードという仕組みによるものです。

2. namespace


以下の手順を試してみましょう。

(1)utility」フォルダーの中に「NameSpaceLogger.php」を作成し、
次のサンプルコードのようにプログラムを書き込んで保存してください。
<?php 

function dateEcho($object)
{
    $now = date('[Y/m/d H:i:s]');
    echo $now . ' ' . $object . '<br>';
}

function dateEcho($object)
{
    $now = date('[Y/m/d]');
    echo $now . ' ' . $object . '<br>';
}

上記のコードを保存すると、関数名の重複によりエラーが表示されます。このように、PHPでは同名の関数を定義することはできません。しかし、大規模なプロジェクトになるとソースコードが増え、そうなると一つのファイルに読み込むファイルも当然増えます。自分一人が関数名の重複に気を付けていたとしても、別の人が書いたファイルを読み込んだ際に重複してしまうリスクはどうしても避けられません。

これを解消する、namespace名前空間)という仕組みを利用しましょう。

(2)NameSpaceLogger.php」を次のサンプルコードのように変更してください。
<?php 
namespace utility\NameSpaceLogger01;

function dateEcho($object)
{
    $now = date('[Y/m/d H:i:s]');
    echo $now . ' ' . $object . '<br>';
}

namespace utility\NameSpaceLogger02;

function dateEcho($object)
{
    $now = date('[Y/m/d]');
    echo $now . ' ' . $object . '<br>';
}
(3)FirstStep.php」を次のサンプルコードのように変更してください。
<?php 
include './utility/Logger.php';
include './utility/NameSpaceLogger.php'; // インクルード文を追加

FirstStep::main();

class FirstStep
{
    public static function main()
    {
        utility\NameSpaceLogger01\dateEcho('hello'); // 時間付きの表示処理を呼び出し
        utility\NameSpaceLogger02\dateEcho('hello'); // 日付のみの表示処理を呼び出し
    }
}

ブラウザから「http://localhost/php_basic/FirstStep.php」を確認すると、同名の関数にも関わらず処理を呼び出し分けられています。

これはnamespace名前空間)によるもので、namespaceを定義することで、コードが属する空間に名前を定義することができます。そして、空間が違えば同じ関数名を定義することが可能になります。

関数を呼び出す側には、使用したい関数の属する空間名の後に、バックスラッシュ続きで関数名を記述することで呼び出せます。

今回のように、namespaceはファイル名を参考に命名するなどわかりやすい名前にするようにしましょう。

Tips
名前空間の利用

上記では、関数について説明しましたが
クラス
インターフェース
定数
も、異なる名前空間上であれば同名を定義することが可能です。

3. use


名前空間名から関数を記述することで関数名を一意な(重複のない)状態にすることができました。ですが、呼び出すたびに長い名前を指定するのはソースの可読性を損ねてしまいます。そこでuse文を使用してエイリアス別名)を作成して呼び出してみましょう。

(1)FirstStep.php」を次のサンプルコードのように変更してください。
<?php 
include './utility/Logger.php';
include './utility/NameSpaceLogger.php';

use utility\NameSpaceLogger01 as YmdHis; // エイリアスの作成
use utility\NameSpaceLogger02 as Ymd; // エイリアスの作成

FirstStep::main();

class FirstStep
{
    public static function main()
    {
        YmdHis\dateEcho('Hello!');
        Ymd\dateEcho('Hello!');
    }
}

上記のように、use文を使うことで名前空間に別名を与えることができます。また、エイリアス(as 別名)を省略した場合は、最後のバックスラッシュ以降がエイリアスとして定義され、これをインポートといいます。

インポートの例

<?php 
include './utility/Logger.php';
include './utility/NameSpaceLogger.php';

use utility\NameSpaceLogger01 as YmdHis; // use \utility\NameSpaceLogger02 as Ymd;
use utility\NameSpaceLogger02; // use utility\NameSpaceLogger02 as NameSpaceLogger02 と同義

FirstStep::main();

class FirstStep
{
    public static function main()
    {
        YmdHis\dateEcho('Hello!');
        NameSpaceLogger02\dateEcho('Hello!'); // 変更
    }
}

問題

確認問題


確認問題

この中でインクルードの説明として正しくないものはどれか?