スライドショー

【PHP入門】名前空間(namespace/use)の使い方をわかりやすく解説!

プログラムにおいて、クラスや関数などの名前の衝突を防ぐために名前空間を使用して、それぞれグループ化することがあります。

PHPでは、namespaceuseといったキーワードを使用して名前空間を使用します。

この記事では、

・namespaceとは?
・namespaceの基本的な使い方
・namespaceを{}(波カッコ)で囲む方法
・namespaceの注意点
・useとは?
・useの基本的な使い方

などの名前空間の使い方に関して解説していきます。

今回はそんな名前空間(namespace use)を使用する方法について、わかりやすく解説します!

namespaceとは

namespace名前空間とも呼ばれ、項目をカプセル化するときに使用します。

名前空間とは、例えば通常同じファイルに同じクラスや関数名、定数名が存在することはできませんが、名前空間を使用することにより、関連するクラスや、インターフェイス、関数、定数などをグループ化することが可能です。

そのため、名前空間を指定しておけば自分が作ったクラスが、サードパーティのクラスや関数などと名前が衝突することを防ぐことができます。

namespaceは以下のように記述します。

書き方:

namespace 名前空間名;

名前空間はソースコードの1番先頭で宣言する必要があります。
「クラス」「インターフェイス」「関数」「定数」が名前空間の影響を受けます。

また、namespaceの前にHTMLを記述するとエラーになりますので注意しましょう。

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>namespace_test</title>
</head>
<body>
<?php
namespace sample;
?>
・・・

このようにHTMLを記述するとエラーとなります。

namespaceの使い方

ここでは、namespaceを使用しないで別々のソースファイルから同名の関数を呼出したときにどうなるかを説明するとともに、名前空間を使用してどのように解決するかを見ていきましょう。

名前の衝突とは

namespaceを指定すれば、前述したように同一のファイルでクラスや関数などの名前の衝突を防ぐことができます。

例えば、以下のソースファイルsample1.phpに同じ名前の関数が存在し、sample2.phpから関数を呼び出そうとすると、エラーが発生します。

sample1.php

<?php

function getName(){
  return 'Samurai';
}

function getName(){
  return ‘Engineer';
}

?>

sample2.php

<?php

//phpファイルを読み込む
require_once 'sample1.php';

//関数の呼出し
echo getName();

?>

エラー:

PHP Fatal error:  Cannot redeclare getName() (previously declared in ~

当然ながら関数getNameが既に存在するため、再宣言できない旨のエラーが発生しています。

名前空間を指定する

前項で同一ファイルで同じ関数名を指定しても、同名の関数が使用できないことがわかりました。

そこで同じ関数名を使用するためにはnamespaceを使用して、関数を明確に区別する必要があります。

以下にnamespaceを使用して、同一関数名を呼び出す方法を記述します。

sample1.php

<?php

namespace name1;

function getName(){
  return 'Samurai';
}

namespace name2;

function getName(){
  return 'Engineer';
}

?>

sample2.php

<?php

//phpファイルを読み込む
require_once 'sample1.php';

//関数の呼出し
echo name1\getName();
echo name2\getName();

?>

実行結果:

SamuraiEngineer

今回はしっかりと同一関数が呼び出せることがわかりましたね!

namespaceを宣言すると、その後に記述した関数はその名前空間の関数に属します。

サンプルではname1とname2を宣言して、その直後に関数を記述しているため、name1のgetName関数とname2のgetName関数でそれぞれ区別されることになります。

sample2.phpで関数を呼び出すときは、「名前空間\関数名」とすれば同一の関数を呼び出すことが可能となります。

{}(波カッコ)で囲む方法

名前空間は{}(波カッコ)で囲んで定義することもできます。

波カッコで囲む場合は、namespaceで指定したい範囲を囲む必要があります。

sample1.php

<?php

namespace name1{
  function getName(){
    return 'Samurai';
  }
}

namespace name2{
  function getName(){
    return 'Engineer';
  }
}

?>

sample2.php

<?php

//phpファイルを読み込む
require_once 'sample1.php';

//関数の呼出し
echo name1\getName();
echo name2\getName();

?>

実行結果:

SamuraiEngineer

波カッコを使用しても、先ほどのサンプルと同様に関数をそれぞれ呼び出せることがわかりますね!

名前空間は波カッコで囲んだほうがわかりやすいですが、なるべく1つのファイルには1つの名前空間にすることが推奨されています。

名前空間の注意点

名前空間は、範囲を波カッコで囲むと、名前空間の範囲の外で命令文を記述することができなくなります。

以下のサンプルではエラーが発生します。

名前空間の外で命令文を記述:

namespace name1{
  function getName(){
    return 'Samurai';
  }
}

namespace name2{
  function getName(){
    return 'Engineer';
  }
}

echo 'こんにちは!';

エラー:

PHP Fatal error:  No code may exist outside of namespace {} in ~

{}(波カッコ)の外のコードが存在しない旨のエラーが発生しました。

そのため、namespaceを波カッコで指定するときには注意しましょう。

useとは

useとは名前空間の拡張機能で、外部のエイリアスやその一部を参照したり、クラス・関数・定数などをインポートするときに使用します。

useキーワードは、WindowsのショートカットやUnix系のシンボリックリンクを作成する機能に似ています。

useキーワードを使用して、エイリアスを定義するためには以下のように記述します。

書き方:

use [名前空間または一部・クラス・関数・定数など] as 別名称

useキーワードを使用すれば、名前空間などのフルパスを短縮して、別の名称で定義することが可能です。

useの使い方

以下にuseキーワードを使用して名前空間の一部を取得し、それぞれの名前空間の関数を呼び出す方法を記述します。

place.php

<?php

namespace asia\japan\tokyo\shibuya;

function getName(){
  return 'shibuya';
}

namespace asia\japan\tokyo\minato;

function getName(){
  return 'minato';
}

namespace asia\japan\tokyo\shinagawa;

function getName(){
  return 'shinagawa';
}

?>

read.php

<?php

//phpファイルを読み込む
require_once 'place.php';

//名前空間をインポート
use asia\japan\tokyo as name;

//関数の呼出し
echo name\shibuya\getName();
echo '<br>';
echo name\minato\getName();
echo '<br>';
echo name\shinagawa\getName();

?>

実行結果:

shibuya
minato
shinagawa

サンプルではuseキーワードを使用して、place.phpの3つ名前空間の共通バスである「asia\japan\tokyo 」までをインポートして、名前空間を「name」の名称に指定しています。

nameからそれぞれのエリアの名称と関数をつなげれば、パスを短縮して同名の関数を呼び出すことができます。

まとめ

ここでは名前空間を定義するnamespaceの基本的な使い方から、名前空間やクラス、関数などをインポートするuseの使い方を解説しました。

ソースコードなどのファイルが多くなると、名前の衝突を防ぐために名前空間を使用することがありますので、この機会によく覚えておきましょう。

もし、名前空間の意味や使い方を忘れてしまったら、この記事を思い出してくださいね。

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説