国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP名前空間(ネームスペース)

PHP名前空間(ネームスペース)はPHP 5.3で追加されました

ネームスペースとは何ですか?大まかに言えば、名前空間は物事をカプセル化する方法です。この抽象的な概念はさまざまな場(chǎng)所で見(jiàn)られます。たとえば、オペレーティング システムでは、ディレクトリは関連ファイルをグループ化するために使用され、ディレクトリ內(nèi)のファイルの場(chǎng)合、名前空間の役割を果たします。たとえば、ファイル foo.txt はディレクトリ /home/greg と /home/other に同時(shí)に存在できますが、2 つの foo.txt ファイルが同じディレクトリに存在することはできません。さらに、ディレクトリ /home/greg の外にある

foo.txt ファイルにアクセスする場(chǎng)合、/home/greg/foo.txt を取得するには、ファイル名の前にディレクトリ名とディレクトリ區(qū)切り文字を置く必要があります。プログラミングの分野に適用されるこの原則は、名前空間の概念です。

PHP 名前空間は、次の 2 種類(lèi)の問(wèn)題を解決できます:


1. ユーザーが作成したコードと、PHP の內(nèi)部クラス/関數(shù)/定數(shù)またはサードパーティのクラス/関數(shù)/定數(shù)の間の名前の競(jìng)合。 2. ソース コードの可読性を向上させるために、非常に長(zhǎng)い識(shí)別子名 (通常は最初の種類(lèi)の問(wèn)題を軽減するために定義される) のエイリアス (または短い) 名を作成します。

名前空間を定義する

デフォルトでは、PHP が名前空間をサポートする前と同様に、すべての定數(shù)、クラス、関數(shù)名はグローバル空間に配置されます。

名前空間はキーワード namespace で宣言されます。ファイルに名前空間が含まれている場(chǎng)合は、他のすべてのコードの前に名前空間を宣言する必要があります。


構(gòu)文は次のとおりです:

<?php
// 定義代碼在 'MyProject' 命名空間中
namespace MyProject;
// ... 代碼 ...
?>
你也可以在同一個(gè)文件中定義不同的命名空間代碼,如:
<?php
namespace MyProject1;
// MyProject1 命名空間中的PHP代碼
namespace MyProject2;
// MyProject2 命名空間中的PHP代碼
// 另一種語(yǔ)法
namespace MyProject3 {
// MyProject3 命名空間中的PHP代碼
}
?>
名前空間を宣言する前の唯一の有効なコードは、ソース ファイルのエンコード方法を定義する宣言ステートメントです。さらに、空白文字を含むすべての非 PHP コードは、名前空間宣言の前に出現(xiàn)できません:
<?php
 declare(encoding='UTF-8'); //定義多個(gè)命名空間和不包含在命名空間中的代碼
 namespace MyProject {
 
     const CONNECT_OK = 1;
     class Connection { /* ... */ }
     function connect() { /* ... */  }
 }
 
 namespace { // 全局代碼
     session_start();
     $a = MyProject\connect();
     echo MyProject\Connection::start();
 }
 ?>

そして、次のコードはエラーを報(bào)告します

<html>
 <?php
 namespace MyProject; // 命名空間前出現(xiàn)了“<html>” 會(huì)致命錯(cuò)誤 - 命名空間必須是程序腳本的第一條語(yǔ)句
 ?>

サブネームスペースは、ディレクトリやファイル、PHPネームスペースに非常に似ています。階層的な名前空間名を指定することもできます。したがって、名前空間名は階層的な方法で定義できます。

<?php
 namespace MyProject\Sub\Level;  //聲明分層次的單個(gè)命名空間
 const CONNECT_OK = 1;
 class Connection { /* ... */ }
 function Connect() { /* ... */  }
 
 ?>

上の例では、定數(shù) MyProjectSubLevelCONNECT_OK、クラス MyProjectSubLevelConnection、および関數(shù) MyProjectSubLevelConnect を作成します。


名前空間の使用法

名前空間の使用方法について説明する前に、PHP がどの名前空間要素を使用するかをどのように認(rèn)識(shí)するかを理解する必要があります。 PHP 名前空間とファイル システムの間で簡(jiǎn)単に類(lèi)推できます。ファイル システム內(nèi)のファイルにアクセスするには、次の 3 つの方法があります:

1. foo.txt などの相対ファイル名形式。これは currentdirectory/foo.txt として解析されます。ここで、currentdirectory は現(xiàn)在のディレクトリを表します。したがって、現(xiàn)在のディレクトリが /home/foo の場(chǎng)合、ファイル名は /home/foo/foo.txt に解決されます。

2. 相対パス名は、subdirectory/foo.txt の形式です。これは currentdirectory/subdirectory/foo.txt として解析されます。

3. 絶対パス名は /main/foo.txt の形式です。これは /main/foo.txt として解析されます。

PHP 名前空間の要素も同じ原則を使用します。たとえば、クラス名は 3 つの方法で參照できます:

1. 非修飾名、または $a=new foo() や foo::staticmethod() などの接頭辭 のないクラス名。 ;?,F(xiàn)在の名前空間が currentnamespace の場(chǎng)合、foo は currentnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、どの名前空間にもコードが含まれていない場(chǎng)合、foo は foo として解決されます。 警告: ネームスペース內(nèi)の関數(shù)または定數(shù)が未定義の場(chǎng)合、修飾されていない関數(shù)または定數(shù)名はグローバル関數(shù)または定數(shù)名に解決されます。

2. 修飾名、またはプレフィックス を含む名前 ($a = new subnamespacefoo(); または subnamespacefoo::staticmethod(); など)?,F(xiàn)在の名前空間が currentnamespace の場(chǎng)合、foo は currentnamespacesubnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、コードがどの名前空間にも含まれていない場(chǎng)合、foo はサブ名前空間 foo に解決されます。

3. 完全修飾名、またはグローバル接頭辭演算子を含む名前たとえば、$a = new currentnamespacefoo(); または currentnamespacefoo::staticmethod(); です。この場(chǎng)合、foo はコード內(nèi)で常にリテラル名 currentnamespacefoo に解決されます。

これら 3 つのメソッドの使用例を次に示します。

Example

<?php
 namespace Foo\Bar\subnamespace;
 
 const FOO = 1;
 function foo() {}
 class foo
 {
     static function staticmethod() {}
 }
 ?>

Example

<?php
 namespace Foo\Bar;
 include 'file1.php';
 
 const FOO = 2;
 function foo() {}
 class foo
 {
     static function staticmethod() {}
 }
 
 /* 非限定名稱(chēng) */
 foo(); // 解析為 Foo\Bar\foo resolves to function Foo\Bar\foo
 foo::staticmethod(); // 解析為類(lèi) Foo\Bar\foo的靜態(tài)方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
 echo FOO; // resolves to constant Foo\Bar\FOO
 
 /* 限定名稱(chēng) */
 subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
 subnamespace\foo::staticmethod(); // 解析為類(lèi) Foo\Bar\subnamespace\foo,
 // 以及類(lèi)的方法 staticmethod
 echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO
 
 /* 完全限定名稱(chēng) */
 \Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo
 \Foo\Bar\foo::staticmethod(); // 解析為類(lèi) Foo\Bar\foo, 以及類(lèi)的方法 staticmethod
 echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
 ?>

グローバル クラス、関數(shù)、または定數(shù)にアクセスするには、完全修飾名を使用できることに注意してください。 strlen()、例外、INI_ALL など。


名前空間內(nèi)のグローバル クラス、関數(shù)、定數(shù)にアクセスします:

<?php
 namespace Foo;
 
 function strlen() {}
 const INI_ALL = 3;
 class Exception {}
 
 $a = \strlen('hi'); // 調(diào)用全局函數(shù)strlen
 $b = \INI_ALL; // 訪(fǎng)問(wèn)全局常量 INI_ALL
 $c = new \Exception('error'); // 實(shí)例化全局類(lèi) Exception
 ?>


名前空間と動(dòng)的言語(yǔ)機(jī)能

PHP の名前空間の実裝は、言語(yǔ)自體の動(dòng)的機(jī)能の影響を受けます。したがって、以下のコードを名前空間に変換する場(chǎng)合は、要素に動(dòng)的にアクセスします。

インスタンス

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

プログラムの実行結(jié)果:

classname::__construct 関數(shù)名 global

完全修飾名 (名前空間プレフィックスを含むクラス名) を使用する必要があります。動(dòng)的クラス名、関數(shù)名、または定數(shù)名では修飾名と完全修飾名に違いがないため、先頭のバックスラッシュは不要であることに注意してください。


インスタンス

名前空間の要素への動(dòng)的アクセス

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

プログラムの実行結(jié)果:

classname::__construct 関數(shù)名 グローバル クラス名::__construct 関數(shù)名 グローバル 名前空間名クラス名::__construct 名前空間名クラス名::__construct 名前空間名機(jī)能名 名前空間名機(jī)能名 名前空間付き namespaced


namespaceキーワードと__NAMESPACE__定數(shù)

PHPは、現(xiàn)在の名前空間內(nèi)の要素にアクセスする2つの抽象メソッド、__NAMESPACE__マジック定數(shù)とnamespaceキーワードをサポートしています。

定數(shù) __NAMESPACE__ の値は、現(xiàn)在の名前空間の名前を含む文字列です。どの名前空間にも含まれていないグローバル コードには、空の文字列が含まれます。

__NAMESPACE__ 例、名前空間內(nèi)のコード

<?php
 namespace MyProject;
 header("Content-type:text/html;charset=utf-8");    //設(shè)置編碼
 echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
 ?>

プログラムの実行結(jié)果:

"MyProject"

Example

__NAMESPACE__ 例、グローバルコード

<?php
 header("Content-type:text/html;charset=utf-8");    //設(shè)置編碼
 
 echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
 ?>

プログラムの実行結(jié)果:

""

インスタンス

定數(shù) __NAMESPACE__ は、名前を動(dòng)的に作成する場(chǎng)合に便利です。例:

__NAMESP を使用します。動(dòng)的に作成する ACE__ 名前

<?php
 namespace MyProject;
 
 function get($classname)
 {
     $a = __NAMESPACE__ . '\' . $classname;
     return new $a;
 }
 ?>

キーワード名前空間を使用すると、現(xiàn)在の名前空間またはサブ名前空間內(nèi)の要素に明示的にアクセスできます。これは、クラスの self 演算子に相當(dāng)します。

インスタンス

名前空間演算子、名前空間內(nèi)のコード

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

名前空間を使用: alias/import

PHP 名前空間は 2 つをサポートしますエイリアスまたはインポートの使用方法: クラス名にエイリアスを使用するか、名前空間名にエイリアスを使用します。 PHP は関數(shù)や定數(shù)のインポートをサポートしていないことに注意してください。

PHP では、エイリアスは use 演算子を使用して実裝されます。次の 3 つのインポート方法をすべて使用します。


1. use 演算子を使用してエイリアスをインポート/使用します。行には複數(shù)の use ステートメントが含まれています

<?php
 namespace foo;
 use My\Full\Classname as Another;
 
 // 下面的例子與 use My\Full\NSname as NSname 相同
 use My\Full\NSname;
 
 // 導(dǎo)入一個(gè)全局類(lèi)
 use \ArrayObject;
 
 $obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象
 $obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
 NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
 $a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象
 // 如果不使用 "use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象
 ?>

3. インポートと動(dòng)的名

<?php
 use My\Full\Classname as Another, My\Full\NSname;
 
 $obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
 NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
 ?>

4. インポートと完全修飾名

<?php
 use My\Full\Classname as Another, My\Full\NSname;
 
 $obj = new Another; // 實(shí)例化一個(gè) My\Full\Classname 對(duì)象
 $a = 'Another';
 $obj = new $a;      // 實(shí)際化一個(gè) Another 對(duì)象
 ?>

名前空間の使用: フォールバック グローバル関數(shù)/定數(shù)

PHP は、名前空間內(nèi)で修飾されていないクラス、関數(shù)、または定數(shù)の名前を検出すると、別の優(yōu)先順位戦略を使用して名前を解決します。クラス名は常に現(xiàn)在の名前空間內(nèi)の名前に解決されます。したがって、システム內(nèi)のクラス名、または名前空間に含まれていないクラス名にアクセスする場(chǎng)合は、完全修飾名

を使用する必要があります。 例:

1. 名前空間內(nèi)のグローバル クラスにアクセスします

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

関數(shù)と定數(shù)の場(chǎng)合、関數(shù)または定數(shù)が現(xiàn)在の名前空間に存在しない場(chǎng)合、PHP はグローバル空間で関數(shù)または定數(shù)を使用するようにフォールバックします。

2. 名前空間のグローバル関數(shù)/定數(shù)をバックアップします

<?php
 namespace A\B\C;
 class Exception extends \Exception {}
 
 $a = new Exception('hi'); // $a 是類(lèi) A\B\C\Exception 的一個(gè)對(duì)象
 $b = new \Exception('hi'); // $b 是類(lèi) Exception 的一個(gè)對(duì)象
 
 $c = new ArrayObject; // 致命錯(cuò)誤, 找不到 A\B\C\ArrayObject 類(lèi)
 ?>


グローバル空間

名前空間が定義されていない場(chǎng)合、すべてのクラスと関數(shù)はグローバル空間で定義されます。 PHP に名前空間の概念が導(dǎo)入される前と同じです。名前に接頭辭を付けると、その名前が別の名前空間にある場(chǎng)合でも、その名前がグローバル空間にあることを示します。

グローバル空間記述の使用

<?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
 namespace A\B\C;
 
 /* 這個(gè)函數(shù)是 A\B\C\fopen */
 function fopen() {
     /* ... */
     $f = \fopen(...); // 調(diào)用全局的fopen函數(shù)
     return $f;
 }
 ?>

名前解決は次の規(guī)則に従います:

1. 完全修飾名を持つ関數(shù)、クラス、および定數(shù)の呼び出しはコンパイル時(shí)に解決されます。たとえば、新しい AB はクラス AB に解決されます。

2. すべての非修飾名と修飾名 (非完全修飾名) は、現(xiàn)在のインポート ルールに従ってコンパイル時(shí)に変換されます。たとえば、名前空間 ABC が C としてインポートされた場(chǎng)合、CDe() の呼び出しは ABCDe() に変換されます。

3. 名前空間內(nèi)では、インポート ルールに従って変換されないすべての修飾名の前に現(xiàn)在の名前空間名が付きます。たとえば、CDe() が名前空間 AB 內(nèi)で呼び出された場(chǎng)合、CDe() は ABCDe() に変換されます。

4. 修飾されていないクラス名は、現(xiàn)在のインポート ルールに従ってコンパイル時(shí)に変換されます (短いインポート名の代わりに完全な名前が使用されます)。たとえば、名前空間 ABC が C としてインポートされる場(chǎng)合、 new C() は new ABC() に変換されます。

5. 名前空間 (例: AB) 內(nèi)では、非修飾名への関數(shù)呼び出しは実行時(shí)に解決されます。たとえば、関數(shù) foo() の呼び出しは次のように解析されます:

1. 現(xiàn)在の名前空間で ABfoo() という名前の関數(shù)を見(jiàn)つけます

2. グローバル空間で関數(shù) foo() を見(jiàn)つけて呼び出してみます。

6. 名前空間 (AB など) 內(nèi)の非修飾名または修飾名クラス (非完全修飾名) への呼び出しは実行時(shí)に解決されます。以下は、new C() と new DE() を呼び出す解析プロセスです。 new C() の解析:

1. 現(xiàn)在の名前空間で ABC クラスを検索します。

2. クラス ABC を自動(dòng)ロードしてみます。

new DE():

の分析 3. クラス名の前に現(xiàn)在の名前空間名を追加して ABDE となり、クラスを検索します。

4. クラス ABDE を自動(dòng)ロードしてみます。

グローバル名前空間內(nèi)のグローバル クラスを參照するには、完全修飾名 new C() を使用する必要があります。



學(xué)び続ける
||
<?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 ?>
提出するリセットコード
  • おすすめコース
  • コースウェアのダウンロード
現(xiàn)時(shí)點(diǎn)ではコースウェアはダウンロードできません?,F(xiàn)在スタッフが整理中です。今後もこのコースにもっと注目してください?