php5.3「ネーミングスペース」の詳細


一体何が「ネーミングスペース」なのか.中国語のマニュアルを見てみましょう.
ネームスペースの概要
ネーミングスペースとは?広義には、ネーミングスペースは物事をカプセル化する方法です.このような抽象概念は多くの場所で見られる.
たとえば、オペレーティングシステムでは、ディレクトリが関連ファイルをグループ化するために使用され、ディレクトリ内のファイルにとってネーミングスペースの役割を果たします.
具体的には、ファイルfoo.txtは、ディレクトリ/home/gregと/home/otherの両方に存在しますが、同じディレクトリに存在します.
2つのfooは存在しない.txtファイル.また、fooにディレクトリ/home/gregの外にアクセスする.txtファイルの場合、ディレクトリ名を
およびディレクトリ区切り記号をファイル名の前に置く/home/greg/fooを得る.txt.
この原理をプログラム設計分野に応用することがネーミング空間の概念である.
PHPでは、クラスライブラリやアプリケーションの作成時にクラスや関数などの再利用可能なコードを作成する際に発生する2つの問題を解決するためにネーミングスペースが使用されます.
1)ユーザが作成したコードとPHP内部のクラス/関数/定数またはサードパーティクラス/関数/定数との間の名前の競合. 
2)長い識別子名(通常は第1のクラスの問題を緩和するために定義される)の別名(または短い)の名前を作成し、ソースコードの可読性を向上させる. 
概要を見てから初歩的な概念があり、生活の例で説明します.甲にはiphone 5があり、乙にもiphone 5がありますが、私たちははっきり区別することができます.彼らはそれぞれ2人の異なる人に属しているからです. 
ネーミングスペースの定義やルールはあまり言わないので、マニュアルを見て紹介してください.コードがどのように操作されているかを見てみましょう.3つのファイルを作成するのはfile 1です.ph、file2.php、file3.php、file4.php彼らは同じディレクトリレベルに属しています. 1) file1.php
<?php
//               
namespace App\Lib1;

const MYCONST = 'App\Lib1\MYCONST';  

function MyFunction() {  
    return __FUNCTION__;  
}  

class MyClass
{
    static function WhoAmI() {  
	return __METHOD__;  
    }  
}
?>

 2) file2.php
<?php
//                    ,                          (      )。
namespace App\Lib2
{
	const MYCONST = 'App\Lib2\MYCONST';  

	function MyFunction() {  
		return __FUNCTION__;  
	}  

	class MyClass
	{
		static function WhoAmI() {  
			return __METHOD__; 
		}  
	}
} 
?>

file4.php
<?php
//   PHP  ,        
const MYCONST = 'App\Lib4\MYCONST';  

function MyFunction() {  
	return __FUNCTION__;  
}  

class MyClass
{
	static function WhoAmI() {  
		return __METHOD__; 
	}  
}
?>

ここまでfile 1.phpとfile 2.phpの内容はほぼ同じで、
ネーミングスペースの名前だけが違います.
また、ネーミングスペースに関する用語も追加します.
完全修飾名(Fully-qualified name):
任意のPHPコードは、「App」「Lib 1」「MYCONT」「App」「Lib 2」「MyFunction()などのネーミングスペースの反斜線で始まる識別子を参照できます.
完全に名前を限定するのは何の意味もありませんが、最初の反斜線とファイルパスの役割は少し似ています.これは「ルート」グローバル空間を表しています.グローバル空間で異なるMyFunction()を実現すれば、lib 1からMyFunction()を使用することができます.phpまたはlib 2.phpが呼び出します.
完全に名前を限定することは、使い捨て関数呼び出しやオブジェクトの初期化に非常に役立ちますが、大量の呼び出しが発生した場合、実用的な価値はありません.以下の議論では、PHPがネーミングスペースのタイピングの悩みを解消するための他のオプションを提供していることがわかります.
限定名(Qualified name):Lib 1MyFunction()のような少なくとも1つのネーミングスペース区切り記号の識別子.
非限定名(Unqualified name):
MyFunction()などのネーミングスペース区切り記号の識別子はありません.
file 3を見てください.phpがどのように使用するネーミングスペースか
<?php
/**
 *    PHP          , require_once('file4.php')       
 * Fatal error: Cannot redeclare MyFunction()
 */
namespace App\Lib3;

/*      file3.php          */
const MYCONST = 'App\Lib3\MYCONST';

function MyFunction() {
	return __FUNCTION__;
}

class MyClass
{
	static function WhoAmI() {  
		return __METHOD__; 
	}
}

/**
 *  file1.php、file2.php、file4.php    file3.php  ,     echo MYCONST;     App\Lib3\MYCONST,
 *      file4.php     MYCONST   ?  file4.php   " "     ,               
 *   (     ),          MYCONST  ,    file4.php   ,     echo \MYCONST;
 */
require_once('file1.php');
require_once('file2.php');
require_once('file4.php');

/**
 *                  ,          ,     use          
 *   : use     ; ,                    ,  SQL as,   : use      as   ;
 */
use App\Lib1;
use App\Lib2 as B;

/*                */
#      
#       , “ ”  .
echo \App\Lib1\MYCONST . "<br/>";
echo \App\Lib1\MyFunction() . "<br/>";
echo \App\Lib1\MyClass::WhoAmI() . "<br/>";

#    
#       ,        .
echo B\MYCONST . "<br/>";
echo B\MyFunction() . "<br/>";  
echo B\MyClass::WhoAmI() . "<br/>";

#     
echo MYCONST . "<br/>";
echo MyFunction() . "<br/>";  
echo MyClass::WhoAmI() . "<br/>";
?>

ここまでネーミングスペースについて一定の認識を持っています.次に、いくつかの高度な応用を見てみましょう.
__NAMESPACE__定数
__NAMESPACE__PHP文字列です.現在のネーミングスペースの名前を常に返します.グローバルスペース(file 4.phpはグローバルスペースに属します)では空の文字列です.
< ?php  
namespace App\Lib1;  
echo __NAMESPACE__; // outputs: App\Lib1  
?> 

この値は、デバッグ時に非常に役立ちます.また、次のような完全に限定されたクラス名を動的に生成することもできます.
< ?php  
namespace App\Lib1;  
 
class MyClass {  
    public function WhoAmI() {  
        return __METHOD__;  
    }  
}  

$c = __NAMESPACE__ . '\\MyClass';  
$m = new $c;  
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI  
?>  

 
namespaceキーワード
namespaceキーワードは、クラス内のselfネーミングスペースに等価な現在のネーミングスペースまたはサブネーミングスペース内のアイテムを明確に参照するために使用できます.
もっと詳しく説明するのはマニュアルの中で、とても多くの例です.
< ?php  
namespace App\Lib1;  
 
class MyClass {  
    public function WhoAmI() {  
        return __METHOD__;  
    }  
}  
 
$m = new namespace\MyClass;  
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI  
?>  

 
名前空間クラスの自動読み込み
PHP 5の中で最も時間と労力を節約する特性は自動ローディングであり、グローバル(非ネーミングスペース)PHPコードの中で、標準自動ローディング関数を書くことができる:
< ?php  
$obj= new MyClass1(); // classes/MyClass1.php is auto-loaded  
$obj= new MyClass2(); // classes/MyClass2.php is auto-loaded  
 
// autoload function  
function __autoload($class_name) {  
    require_once("classes/$class_name.php");  
}  
?>  
PHP 5.3では、ネーミングスペースクラスのインスタンスを作成できます.この場合、ネーミングスペースとクラス名が__に渡されるように完全に制限されます.Autoload関数、たとえば$class_nameの値はAppLib 1MyClassかもしれません.同じフォルダの下にすべてのPHPクラスファイルを配置し、文字列からネーミングスペースを抽出できますが、ファイル名が競合します.
また、クラスファイルの階層は、名前空間の構造に従って再編成されます.例えば、MyClass.phpファイルは/classes/APP/Lib 1フォルダの下に作成できます.
/classes/App/Lib1/MyClass.php
< ?php namespace App\Lib1;  
 
class MyClass {  
    public function WhoAmI() {  
        return __METHOD__;  
    }  
}  
?>  

ルートフォルダの下にあるファイルは、次のコードを使用します.
myapp.php
< ?php use App\Lib1\MyClass as MC;  
 
$obj = new MC();  
echo $obj->WhoAmI();  
 
// autoload function  
function __autoload($class) {  
 // convert namespace to full file path  
 $class = 'classes/' . str_replace('\\', '/', $class) . '.php';  
 require_once($class);  
}  
?>  

説明:1.クラスAppLib 1MyClassの別名はMCです.2.new MC()はコンパイル時にnew AppLib 1MyClass()に翻訳される.3.文字列AppLib 1MyClassが__に渡されるAutoload関数は、すべてのネーミングスペースの反斜線をファイルパスの正斜線で置き換え、文字列を変更します.classesAppLib 1MyClass.phpファイルが自動的にロードされます.