PHPの名前空間(名前空間)2024 年の最新の入門チュートリアル。このコースでは 名前空間の定義,副名前空間,名前空間,名前空間と動的言語機能,namespaceキーワードと定数__NAMESPACE__,名前空間の使用法:エイリアス/インポート,名前空間を使用して:グローバル関数/定数へのフォールバック,グローバル空間,注文の名前空間, について学習できます。
あなたは、C#やJava、何も新しいものをない名前空間を学習した場合、PHPの名前空間(名前空間)は、PHP 5.3で追加されます。 しかし、PHPはまだ非常に重要な意義を有しています。
PHPの名前空間は、以下の2つの問題を解決することができます:
デフォルトでは、すべての定数、クラス、関数名は、名前空間のサポートPHP前と全く同じ、グローバル空間に配置されています。
キーワードの名前空間により名前空間宣言。 ファイル名にスペースが含まれている場合は、他のコードの前に名前空間を宣言する必要があります。 構文は次のとおりです。
< ?php // 定义代码在 'MyProject' 命名空间中 namespace MyProject; // ja. 代码 ja.
また、のようなコードで同じファイルに異なる名前空間を定義することができます。
< ?php namespace MyProject1; // MyProject1 命名空间中的PHP代码 namespace MyProject2; // MyProject2 命名空间中的PHP代码 // 另一种语法 namespace MyProject3 { // MyProject3 命名空间中的PHP代码 } ?>
ネームスペース固有の法的コードを宣言する前に、符号化方法は、文を宣言するソース・ファイルを定義するために使用されます。 すべての非PHPコードは空白が名前空間宣言の前に記述することはできません含まれています。
<?php declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码 namespace MyProject { const CONNECT_OK = 1; class Connection { /* ja. */ } function connect() { /* ja. */ } } namespace { // 全局代码 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
次のコードの構文エラーが発生します。
<html> <?php namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
ディレクトリとファイルとの関係は、はるかのように、PHPの名前空間は、階層名前空間の名前を指定することができます。 このように、名前空間の名前は、階層的な方法を使用して定義することができます。
<?php namespace MyProject\Sub\Level; //声明分层次的单个命名空间 const CONNECT_OK = 1; class Connection { /* ja. */ } function Connect() { /* ja. */ } ?>
上記の例では、サブ\レベル\ CONNECT_OK、サブ\レベル\接続\タイプMyProjectと\サブ\レベル\接続と機能MyProjectと\定数MyProjectのを作成します。
PHPの名前空間のクラス名は、次の3つの方法で参照することができます。
このような$ =新しいのfoo()などの非修飾名、またはクラス名の接頭辞が含まれていない、;またはFOO :: staticmethod();。 現在のネームスペースがcurrentnamespaceある場合、fooがcurrentnamespaceの\ fooのように解釈されます。 fooがグローバルコードの場合、コードは任意の名前空間が含まれていない、それはfooのfooのように解析されます。 警告:名前空間の関数や定数が定義されていない場合は、関数名または非修飾定数名は、グローバル関数名、または定数名に解決されます。
修飾名、または名前は 、$ =新しいサブ名前空間の\ fooの(として、接頭辞が含まれています ;)またはサブ名前空間の\ fooという:: staticmethod();。 現在のネームスペースがcurrentnamespaceである場合、fooがcurrentnamespace \のサブ名前空間の\ fooのように解析されます。 fooがグローバルコードの場合、コードは任意の名前空間が含まれていない、fooがサブ名前空間の\ fooのに解決されます。
完全修飾名、または、グローバルプレフィックス演算子名を含む、例えば 、=新しい\のcurrentnamespaceの\の$ fooという();または\ currentnamespace \ fooという:: staticmethod() ;。 この場合、fooが常にコードワード(リテラル名)currentnamespaceの\ fooの名前に解決されます。
ここでは、これらの3つの方法の例は次のとおりです。
file1.phpファイルコード
<?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { static function staticmethod() {} } ?>
file2.phpファイルコード
<?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() {} class foo { static function staticmethod() {} } /* 非限定名称 */ foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod echo FOO; // resolves to constant Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO ?>
任意のグローバルクラス、関数や定数にアクセスするにはなお、あなたは(そのような\ strlenのように、完全修飾名を使用することができます)または\例外または\ INI_ALL。
グローバルなクラス、関数および定数へのアクセス名前空間:
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = \strlen('hi'); // 调用全局函数strlen $b = \INI_ALL; // 访问全局常量 INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception ?>
独自の動的言語機能の影響を受け、PHPの名前空間を実装します。 だから、あなたが名前空間に次のコードは、ダイナミックアクセス要素が必要な場合。
example1.phpファイルコード:
<?php class classname { function __construct() { echo __METHOD__,"\n"; } } function funcname() { echo __FUNCTION__,"\n"; } const constname = "global"; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "\n"; // prints global ?>
あなたは(名前空間接頭辞のクラス名を含む)完全修飾名を使用する必要があります。 動的なクラス名、関数名、または定数名、修飾名および完全修飾名には差がないので、ので、先頭のバックスラッシュが不要であることに注意してください。
ダイナミックアクセス名前空間の要素
<?php namespace namespacename; class classname { function __construct() { echo __METHOD__,"\n"; } } function funcname() { echo __FUNCTION__,"\n"; } const constname = "namespaced"; include 'example1.php'; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "\n"; // prints global /* note that if using double quotes, "\\namespacename\\classname" must be used */ $a = '\namespacename\classname'; $obj = new $a; // prints namespacename\classname::__construct $a = 'namespacename\classname'; $obj = new $a; // also prints namespacename\classname::__construct $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname $b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname echo constant('\namespacename\constname'), "\n"; // prints namespaced echo constant('namespacename\constname'), "\n"; // also prints namespaced ?>
PHPは、現在の名前空間の抽象インテリアエレメント、__ NAMESPACE__マジック定数とnamespaceキーワードをアクセスするには2つの方法をサポートしています。
__NAMESPACE__定値は、現在の名前空間の名前を含む文字列です。 グローバルでは、コードは、空の文字列が含まれている任意の名前空間が含まれていません。
__NAMESPACE__例、名前空間のコードで
<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
__NAMESPACE__例、グローバルコード
<?php echo '"', __NAMESPACE__, '"'; // 输出 "" ?>
例えば名前が有用であるときに動的に作成された定数__NAMESPACE__、:
__NAMESPACE__動的に作成した名前を使用します
<?php namespace MyProject; function get($classname) { $a = __NAMESPACE__ . '\\' . $classname; return new $a; } ?>
名前空間のキーワードを明示的に現在の名前空間またはサブ名前空間要素にアクセスするために使用することができます。 これは、自己の演算子のクラスに相当します。
名前空間演算子の名前空間コード
<?php namespace MyProject; use blah\blah as mine; // see "Using namespaces: importing/aliasing" blah\mine(); // calls function blah\blah\mine() namespace\blah\mine(); // calls function MyProject\blah\mine() namespace\func(); // calls function MyProject\func() namespace\sub\func(); // calls function MyProject\sub\func() namespace\cname::method(); // calls static method "method" of class MyProject\cname $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b ?>
名前空間演算子、グローバルコード
<?php namespace\func(); // calls function func() namespace\sub\func(); // calls function sub\func() namespace\cname::method(); // calls static method "method" of class cname $a = new namespace\sub\cname(); // instantiates object of class sub\cname $b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b ?>
PHPの名前空間は、二つのエイリアスを使用するか、インポートをサポート:名前空間の名前のクラス名のエイリアス、またはエイリアスを使用してください。 PHPは関数や定数のインポートをサポートしていませんので注意してください。
PHPでは、以下のことを達成するために、オペレータ用のエイリアスは3例をインポートするには、すべての可能な方法を使用することです:
1、使用オペレータのインポート/エイリアスを使用して、
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use \ArrayObject; $obj = new namespace\Another; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 ?>
2、複数のuse文を含む行
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func ?>
インポート操作は、コンパイル時に行われるが、動的なクラス名、機能名、または定数の名前ではありません。
3、インポートおよび動的な名前
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化一个 My\Full\Classname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?>
また、インポート操作のみが修飾されていないと修飾名に影響を与えます。 完全修飾名、それが識別されるので、それをインポートすることによって影響を受けません。
4、インポートと完全修飾名
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // instantiates object of class My\Full\Classname $obj = new \Another; // instantiates object of class Another $obj = new Another\thing; // instantiates object of class My\Full\Classname\thing $obj = new \Another\thing; // instantiates object of class Another\thing ?>
PHPは修飾されていないクラス、関数や定数名に遭遇したとき、名前空間では、それは名前を解決するために、異なる優先戦略を使用しています。 現在の名前空間の名前のクラス名は、常にに解決されます。 したがって、クラス名の名前空間に含まれているシステムまたはしないように内部アクセスでは、次の例のように、完全修飾名を使用する必要があります。
1、名前空間にグローバルクラスへのアクセス
<?php namespace A\B\C; class Exception extends \Exception {} $a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象 $b = new \Exception('hi'); // $b 是类 Exception 的一个对象 $c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类 ?>
関数と定数については、関数が存在しないか、現在の名前空間の定数場合、PHPは、空間内でグローバル関数や定数にフォールバックします。
2、グローバル関数の名前空間に確保/定数
<?php namespace A\B\C; const E_ERROR = 45; function strlen($str) { return \strlen($str) - 1; } echo E_ERROR, "\n"; // 输出 "45" echo INI_ALL, "\n"; // 输出 "7" - 使用全局常量 INI_ALL echo strlen('hi'), "\n"; // 输出 "1" if (is_array('hi')) { // 输出 "is not array" echo "is array\n"; } else { echo "is not array\n"; } ?>
あなたが任意の名前空間を定義しない場合、すべてのクラス定義と関数は、名前空間の概念を導入する前のようにグローバル空間とPHPです。 \接頭辞名は名前がグローバルネームスペースであることを示す前に、それはまた名前が配置されている場合でも、他の名前空間の真のです。
説明Useグローバル空間
<?php namespace A\B\C; /* 这个函数是 A\B\C\fopen */ function fopen() { /* ja. */ $f = \fopen(ja.); // 调用全局的fopen函数 return $f; } ?>
授業時間の中で最もエラーが発生しやすい使用された名前空間を持つので、このクラスのパスが何であるか見つけることができます。
<?php namespace A; use B\D, C\E as F; // 函数调用 foo(); // 首先尝试调用定义在命名空间"A"中的函数foo() // 再尝试调用全局函数 "foo" \foo(); // 调用全局空间函数 "foo" my\foo(); // 调用定义在命名空间"A\my"中函数 "foo" F(); // 首先尝试调用定义在命名空间"A"中的函数 "F" // 再尝试调用全局函数 "F" // 类引用 new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象 // 如果未找到,则尝试自动装载类 "A\B" new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象 // 如果未找到,则尝试自动装载类 "B\D" new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象 // 如果未找到,则尝试自动装载类 "C\E" new \B(); // 创建定义在全局空间中的类 "B" 的一个对象 // 如果未发现,则尝试自动装载类 "B" new \D(); // 创建定义在全局空间中的类 "D" 的一个对象 // 如果未发现,则尝试自动装载类 "D" new \F(); // 创建定义在全局空间中的类 "F" 的一个对象 // 如果未发现,则尝试自动装载类 "F" // 调用另一个命名空间中的静态方法或命名空间函数 B\foo(); // 调用命名空间 "A\B" 中函数 "foo" B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法 // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B" D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法 // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D" \B\foo(); // 调用命名空间 "B" 中的函数 "foo" \B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法 // 如果类 "B" 未找到,则尝试自动装载类 "B" // 当前命名空间中的静态方法或函数 A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B" \A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B" ?>
解像度がこれらの規則に従ってください名前: