PHPの名前空間(名前空間)2024 年の最新の入門チュートリアル。このコースでは 名前空間の定義,副名前空間,名前空間,名前空間と動的言語機能,namespaceキーワードと定数__NAMESPACE__,名前空間の使用法:エイリアス/インポート,名前空間を使用して:グローバル関数/定数へのフォールバック,グローバル空間,注文の名前空間, について学習できます。

PHPの名前空間(名前空間)

あなたは、C#やJava、何も新しいものをない名前空間を学習した場合、PHPの名前空間(名前空間)は、PHP 5.3で追加されます。 しかし、PHPはまだ非常に重要な意義を有しています。

PHPの名前空間は、以下の2つの問題を解決することができます:

  1. ユーザーが記述したコード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つの方法で参照することができます。

  1. このような$ =新しいのfoo()などの非修飾名、またはクラス名の接頭辞が含まれていない、;またはFOO :: staticmethod();。 現在のネームスペースがcurrentnamespaceある場合、fooがcurrentnamespaceの\ fooのように解釈されます。 fooがグローバルコードの場合、コードは任意の名前空間が含まれていない、それはfooのfooのように解析されます。 警告:名前空間の関数や定数が定義されていない場合は、関数名または非修飾定数名は、グローバル関数名、または定数名に解決されます。

  2. 修飾名、または名前は 、$ =新しいサブ名前空間の\ fooの(として、接頭辞が含まれています ;)またはサブ名前空間の\ fooという:: staticmethod();。 現在のネームスペースがcurrentnamespaceである場合、fooがcurrentnamespace \のサブ名前空間の\ fooのように解析されます。 fooがグローバルコードの場合、コードは任意の名前空間が含まれていない、fooがサブ名前空間の\ fooのに解決されます。

  3. 完全修飾名、または、グローバルプレフィックス演算子名を含む、例えば 、=新しい\の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
?>

namespaceキーワードと定数__NAMESPACE__

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"
?>

解像度がこれらの規則に従ってください名前:

  1. 機能クラスの完全修飾名とコンパイル時に解決一定のコール。 たとえば、 新しい\ A \ Bは、クラスA \ Bに解決します
  2. すべての非修飾および修飾名(ない完全修飾名)は、現在のインポートルールに基づいて、コンパイル時に変換されます。 名前空間はA \ B \ Cは Cとしてインポートされ場合その後、C \ D \ E()への呼び出しは\ B \ C \ D \のに変換されます)(E。
  3. 名前空間は内部に、インポートルールに従って翻訳されていないすべての修飾された名前は、その前に現在の名前空間名に追加されます。 たとえば、名前空間A \ B内部)(C \ D \ eを呼び出しその後、C \ D \電子()\ B \ C \ D \のに変換されます)(E。
  4. 現在のインポートルールに基づいて、コンパイル時に(完全な名前の代わりに短い導入の名前で)変換器の非修飾クラス名。 たとえば、名前空間がA \ B \ Cが C、 新しいC()としてインポートされている場合は、新しいA \ B \ C()に変換されます。
  5. (このような\ Bとして)内部名前空間は、修飾されていない関数名が実行時に解決されるに呼び出します。 たとえば、fooという関数の呼び出しは()のように解決されます。
    1. 現在の名前空間()関数内の\ Bの\ fooという呼ば探します
    2. グローバル(グローバル)スペース関数foo()を見つけると呼び出すようにしてください
  6. 名前空間(たとえば、\ Bの)クラス名の非修飾または修飾名の内部(ない完全修飾名)の呼び出しが実行時に解決されます。 ここでは、新しいC()への呼び出しと解決プロセスの新しいDの\ Eは()です: 新しいC()構文解析は:
    1. 現在のネームスペース内の\ B \ Cのクラスを検索します。
    2. これは、オートロードA \ B \ Cにしよう
    新しいD \ E()の解析:
    1. \ Bの\ Dの\のE:現在の名前空間の名前で始まるクラス名となり 、そのクラスを探します。
    2. これは、自動ロードA \ B \ D \ Eにしよう
    グローバル名前空間グローバルクラスを参照するには、完全修飾名新しい\ C()を使用する必要があります
PHPの名前空間(名前空間)
10/30