前回の記事では「PHPクラスの継承を取得するには?」をお届けしました。 (概要共有) 》では、PHPクラスの継承に関する関連知識を詳しく紹介していますが、今回も引き続きPHPの名前空間に関する関連知識を見ていきますので、皆様のお役に立てれば幸いです。
ネームスペースは実際には抽象的な概念です。たとえば、日常生活では、オペレーティング システムのディレクトリは、関連するファイルをグループ化するために使用されます。ディレクトリ内のファイルについては、たとえば、名前空間の役割を果たします。
だから名前空間とは何ですか? 実際には、名前空間は物事をカプセル化する方法として理解できます。PHP のクラス、関数、定数は同じ名前を持つことはできません。これらが同じ名前を持つことを防ぎ、相互間の同じ名前の問題を解決するためです。 3 つの名前空間を使用する必要があります。
PHP では、名前空間は主に、ユーザーが作成したコードと、PHP の内部またはサードパーティのクラス、関数、および定数の間の名前の競合を解決するために使用されます。ファイルが多すぎると、常に重複する可能性があります。 ;また、コードの読みやすさを向上させるために、長い識別子名に対して非常に短い名前を作成します。
それでは、名前空間はどのように宣言される、つまり定義され、使用されるのでしょうか?次に、名前空間を定義する方法を見てみましょう。
名前空間の定義
PHP の任意の正しいコードを名前空間に含めることができますが、クラス、関数、定数などのみを含めることができます。型のコードは名前空間の影響を受けます。
namespace
キーワードを使用して、名前空間の定義を完了します。その構文形式は次のとおりです:
namespace 命名空间名;
例は次のとおりです:
<?php // 定义代码在 'named' 命名空间中 namespace named; //在这里可以不使用大括号 // ... 代码 ... ?>
2 つの名前空間を定義します:
<?php namespace MyProject { //这里建议大家使用大括号,这里定义了一个名为MyProject的命名空间 const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace Another { //这里定义了一个名为Another的命名空间 const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>
定義サブ名前空間
PHP の名前空間間の関係はディレクトリとファイルに非常に似ており、階層的な名前空間名を指定できます。したがって、名前空間の名前は階層的に定義でき、その構文は次のとおりです。
namespace App\Model; namespace App\Controller\Home;
例は次のとおりです。
<?php namespace MyProject\Sub\Level; //声明分层次的单个命名空间 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } ?>
上記の例では、定数 MyProject\Sub\Level\CONNECT_OK、クラス MyProject\Sub\Level\Connection、関数 MyProject\Sub\Level\Connect
が定義されています。名前空間
1 つのファイルで複数の名前空間を定義するための 2 つの構文形式があります。例は次のとおりです:
最初の構文は単純な構文の組み合わせ
<?php namespace named; const CONNECT_OK = 1; class className { /* ... */ } namespace names; const CONNECT_OK = 1; class className { /* ... */ } ?>
で、次に中括弧 {}
<?php namespace named{ const CONNECT_OK = 1; class className { /* ... */ } } namespace names{ const CONNECT_OK = 1; class className { /* ... */ } } ?>
です。上記の導入を通じて、名前空間を定義する方法はすでにわかりました。名前空間を定義する スペースだけでは十分ではありません。PHP でそれを使用することがより重要です。次に、名前空間の使用方法を見てみましょう。
名前空間の使用
名前空間の使用方法を理解する前に、PHP での名前空間の使用方法を理解する必要があります。使用する名前空間を決定するには、PHP での名前空間要素へのアクセスの原則を知る必要があります。まず、PHP についてはあまり詳しくありませんが、ファイル システム内のファイルにアクセスする方法をまとめると、
相対ファイル名、相対パス名、絶対パス名の 3 つになります。
PHP 名前空間の要素は同じ原則のみを使用します。たとえば、名前空間の下のクラス名は 3 つの方法で導入できます:
Unqualified name、またはプレフィックスのないクラス名 (現在のネームスペースが currentnamespace
の場合は $a = new test()
や test
など)その場合、テストは currentnamespace\test
として解決されます。 test のコードがグローバルであり、名前空間にコードが含まれていない場合、test は test として解析されます。
名前 を修飾するか、現在の名前空間の場合は $a = new subnamespace\test()
などのプレフィックス名を含めます。 currentnamespace
である場合、テストは currentnamespace\subnamespace\test
として解析されます。テストのコードがグローバルであり、名前空間にコードが含まれていない場合、テストは次のように解析されます サブ名前空間\foo
。
完全修飾名、またはグローバル接頭辞演算子を含む名前 ($a = new \currentnamespace\test()
など) , この場合、test はコード内で常にリテラル名 currentnamespace\test
に解決されます。
これら 3 つのメソッドを使用する例を次に示します。demo.php
と index.php
という 2 つの PHP ソース ファイルが必要です。サンプル コードは次のとおりです。
<?php namespace Test\Bar\Demo; const FOO = 1; function foo() {} class foo { public function demo() { echo '命名空间为:Test\Bar\Demo'; } } ?>
<?php namespace Foo\Bar; include 'Demo.php'; const FOO = 2; function foo() { echo 'Foo\Bar 命名空间下的 foo 函数<br>'; } class foo { static function demo(){ echo '命名空间为:Foo\Bar<br>'; } } /* 非限定名称 */ foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo foo::demo(); // 解析为类 Foo\Bar\foo 的静态方法 staticmethod。 echo FOO.'<br>'; // 解析为常量 Foo\Bar\FOO /* 限定名称 */ Demo\foo(); // 解析为函数 Foo\Bar\Demo\foo Demo\foo::demo(); // 解析为类 Foo\Bar\Demo\foo, // 以及类的方法 demo echo Demo\FOO.'<br>'; // 解析为常量 Foo\Bar\Demo\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::demo(); // 解析为类 Foo\Bar\foo, 以及类的方法 demo echo \Foo\Bar\FOO.'<br>'; // 解析为常量 Foo\Bar\FOO ?>
上記の例では、グローバル クラス、関数、または定数にアクセスするには、\strlen などの完全修飾名を使用できることに注意する必要があります。 ()
または \Exception
など。
别名、导入
PHP 允许通过别名引用或导入的方式来使用外部的命名空间,这是命名空间的一个重要特征。
在PHP中,通过use
关键字和as
配合可以实现命名空间的导入和设置别名。它的语法格式如下:
use 命名空间 as 别名;
示例如下:
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use ArrayObject; // 导入一个函数 use function My\Full\functionName; // 导入一个函数并定义别名 use function My\Full\functionName as func; // 导入一个常量 use const My\Full\CONSTANT; $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 对象 func(); // 调用 My\Full\functionName 函数 echo CONSTANT; // 打印 My\Full\CONSTANT 常量 ?>
其中需要注意的是,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。
以上がPHP での名前空間の定義と使用 (詳細な例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。