名前空間は主に、コード内のクラスと関数の間で起こり得る競合の問題を解決するために使用されます。この記事では、名前空間の定義やその他の知識ポイントを含む、PHP の主要な機能を紹介します。名前空間は、主にコード内のクラスと関数間の競合の問題を解決するために使用されます。他の言語には以前からこの機能がありましたが、PHP の登場は遅ればせながら PSR-4 を生み出し、PSR-4 は Composer の台頭も生み出したので、非常に重要な機能です。
ネームスペースの定義ネームスペースは主にその下のクラスや関数を識別するために使用されるコンテナです。名前空間が定義されると、その下のコードはこの名前空間に属するため、名前空間の定義はコードの最初に行う必要があります。
同じパッケージの場合、同じ名前空間またはサブ名前空間内のコードを PHP ファイルで定義する必要はありません。サブ名前空間内のコードは、結合されると特定のモジュールの作業を完了します。パッケージスペースの完全な名前。
作成したコードが名前空間を定義していない場合、それはグローバル名前空間 (シンボル) に属していることを意味するため、(シンボルを追加せずに) クラスまたは関数を直接参照できます。
名前空間識別子を参照する3つの方法(1)完全修飾名
は、オペレーティングシステム上の絶対パスに似ており、完全なパスであるため、理解する際に誤解はありません。
たとえば、新しい ABC では、C は AB 名前空間の C クラスに解決されます。
(2) 修飾名
はオペレーティング システムの相対パスに似ており、名前の一部が含まれており、現在の名前空間を参照します。
たとえば、名前空間 A で BC() が呼び出された場合、最終的に参照される名前空間は ABC() になります。
(3) 非修飾名
は修飾名と似ていますが、サブ名前空間は含まれません。
たとえば、C() が名前空間 AB で呼び出された場合、最終的に参照される名前空間は ABC() になります。
例を通して 3 つの参照メソッドを説明します:namespace \Example; require_once "fnction.php"; class ClassA {} function Function() {} //完全限定名称 \Example\Function(); \Example\B\Function(); //限定名称 B\Function(); //指向 \Example\B\Function(); //非限定名称 $test = new ClassA(); //resolves to \Example\ClassA Function(); //指向 \Example\Function
注: •ネームスペース内では、現在のスコープで関数と定数の定義が見つからない場合、PHP はエラーを報告します。代わりに、グローバル名前空間でそれを探してください。
•名前空間内で、現在のスコープにクラス定義が見つからない場合、PHP はエラーを直接報告し、対応するクラスを見つけるためにグローバル スコープに移動しません。そのため、内部またはユーザー定義のクラス定義を参照する必要がある場合は、クラスでは、完全修飾名を使用する必要があります。
簡単な例を見てみましょう。まず、(名前空間で定義された) コードを作成し、function.php という名前を付けます。次に、コード test.php を作成します。これも以下のコードです。名前空間 :
namespace Foo\Bar\subnamespace; const FOO = 1; function foo() { return "foo\r\n"; } class foo { static function staticmethod() { return __METHOD__ . "\r\n" ; } function foofunction() { return __METHOD__ . "\r\n" ; } }Import、alias
使用する名前空間階層が長くてたくさんある場合は特に面倒なので、 use キーワードを使用して名前空間をインポートできます。 、クラス、定数、関数などを使用して、完全な名前を直接参照できます。 alias キーワードを使用すると、インポートされたクラスと関数の名前を変更できます。
たとえば、use キーワードの使用方法については、このコードはグローバル名前空間の下にあります:
namespace secondsp;
include 'function.php';
class foo
{
function foofunction()
{
return __METHOD__ . "\r\n" ;
}
}
function is_file($file)
{
return true ;
}
//非限定名称:实例化secondsp\foo类对象
$obj = new foo;
echo $obj->foofunction();
//实例化Foo\Bar\subnamespace\foo 类对象
$obj = new Foo\Bar\subnamespace\foo ;
echo $obj->foofunction();
//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
//$obj = new ArrayObject(array(1));
$obj = new \ArrayObject(array(1));
//在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
echo strlen("nihao");
//引用当前命名空间下的函数
var_dump(is_file('nihao')); //True
//引用全局函数
var_dump(\is_file('nihao')); //False
•Python とは異なり、PHP の名前空間はセマンティックなものです概念には何も関係ありません言い換えれば、名前空間を使用するコードは、Python でライブラリ ファイルがどのように構成されているかは関係ありません。が __init__.py ファイルである場合、Python パーサーはパッケージまたはすべてのモジュールのファイルを自動的にインポートします。
•PHPにおけるスコープの概念は非常に弱く、例えばグローバル空間の変数は関数やクラス内で参照することができません。名前空間では状況が異なります。名前空間を定義するコードが対応する名前空間で定数と関数を見つけられない場合は、グローバル定数と関数が使用されます。また、対応する名前空間でクラスが見つからない場合は (独自の Define クラスを含む)、 )、コードはエラーを直接報告します。
•use キーワードを通じて名前空間を使用する場合、PHP はインポートされた名前空間が完全修飾名前空間であるとすでに想定しているため、完全修飾名 (シンボル) を通じてインポートする必要はありません。 •定数、関数、クラス、インターフェイス、その他の名前空間は、use キーワードを使用してインポートできます。
• 名前空間は、より効果的な使用を追求するために、使用方法の仕様と自動ロードのメカニズムが必要です。これが PSR-4 の仕様です。
関連する推奨事項:PHP
namespace、特性とジェネレーターのケースの詳細な説明
phpnamespace使用法グラフィックチュートリアル(コード付き)
以上が名前空間、PHP の主要な機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。