PHP 5.6.0 released

名前空間の概要

(PHP 5 >= 5.3.0)

名前空間とは何でしょう? 広義の「名前空間」とは、項目をカプセル化するもののことです。 これは多くの場面で見られる抽象概念です。 たとえば、たいていの OS はディレクトリでファイルをグループ化します。 この場合、ディレクトリがその中のファイルの名前空間として機能しています。 具体的に言うと、foo.txt というファイルは /home/greg/home/other の両方に存在することが可能ですが、それらふたつの foo.txt を同じディレクトリに配置することはできません。 さらに、/home/greg ディレクトリの外から foo.txt にアクセスするには、ディレクトリ名をファイル名の前につけて /home/greg/foo.txt としなければなりません。 プログラミングの世界における名前空間も、この延長線上にあります。

PHP の世界では、名前空間は次のふたつの問題を解決するための手段として用意されています。 ライブラリやアプリケーションの作者が、 クラスや関数といった再利用可能なコード部品を作ろうとするときにこれらの問題にぶちあたることになります。

  1. あなたが作成したコードと PHP の組み込みのクラス/関数/定数 あるいはサードパーティのクラス/関数/定数の名前が衝突する
  2. 最初の問題を解決するためには、Extra_Long_Names のような長い名前をつけなければならない

PHP の名前空間は、関連するクラスやインターフェイス、関数、そして定数をひとまとめにして扱うものです。 PHP の名前空間構文の例を見てみましょう。

例1 名前空間構文の例

<?php
namespace my\name// "名前空間の定義" を参照ください

class MyClass {}
function 
myfunction() {}
const 
MYCONST 1;

$a = new MyClass;
$c = new \my\name\MyClass// "グローバル空間" を参照ください

$a strlen('hi'); // "名前空間の使用法: グローバル関数/定数への
                   // 移行" を参照ください

$d = namespace\MYCONST// "namespace 演算子および __NAMESPACE__ 定数"
                        // を参照ください
$d __NAMESPACE__ '\MYCONST';
echo 
constant($d); // "名前空間および動的言語機能" を参照ください
?>

注意:

名前空間の名前として PHPphp は使えません。これらで始まる名前 (PHP\Classes など) も同様です。 これらの名前は言語の内部で使うために予約されており、ユーザーのコードで使うことはできません。

add a note add a note

User Contributed Notes 3 notes

up
109
SteveWa
3 years ago
Thought this might help other newbies like me...

Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect  which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with
up
41
Dmitry Snytkine
3 years ago
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1;  // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
up
4
php dot net at e-z dot name
9 months ago
php namespaces are case-insensitive:

file1.php:
<?php
namespace foo;

function
bar()
{
    echo
'from bar';
}

?>

file2.php:
<?php

fOo
\bar() // output: from bar

?>
To Top