PHP での名前空間の定義と使用 (詳細な例)

WBOY
リリース: 2023-04-10 18:22:01
オリジナル
4399 人が閲覧しました

前回の記事では「PHPクラスの継承を取得するには?」をお届けしました。 (概要共有) 》では、PHPクラスの継承に関する関連知識を詳しく紹介していますが、今回も引き続きPHPの名前空間に関する関連知識を見ていきますので、皆様のお役に立てれば幸いです。

PHP での名前空間の定義と使用 (詳細な例)

ネームスペースは実際には抽象的な概念です。たとえば、日常生活では、オペレーティング システムのディレクトリは、関連するファイルをグループ化するために使用されます。ディレクトリ内のファイルについては、たとえば、名前空間の役割を果たします。

だから名前空間とは何ですか? 実際には、名前空間は物事をカプセル化する方法として理解できます。PHP のクラス、関数、定数は同じ名前を持つことはできません。これらが同じ名前を持つことを防ぎ、相互間の同じ名前の問題を解決するためです。 3 つの名前空間を使用する必要があります。

PHP では、名前空間は主に、ユーザーが作成したコードと、PHP の内部またはサードパーティのクラス、関数、および定数の間の名前の競合を解決するために使用されます。ファイルが多すぎると、常に重複する可能性があります。 ;また、コードの読みやすさを向上させるために、長い識別子名に対して非常に短い名前を作成します。

それでは、名前空間はどのように宣言される、つまり定義され、使用されるのでしょうか?次に、名前空間を定義する方法を見てみましょう。

名前空間の定義

PHP の任意の正しいコードを名前空間に含めることができますが、クラス、関数、定数などのみを含めることができます。型のコードは名前空間の影響を受けます。

namespace キーワードを使用して、名前空間の定義を完了します。その構文形式は次のとおりです:

namespace 命名空间名;
ログイン後にコピー

例は次のとおりです:

<?php  
// 定义代码在 &#39;named&#39; 命名空间中  
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.phpindex.php という 2 つの PHP ソース ファイルが必要です。サンプル コードは次のとおりです。

<?php
    namespace Test\Bar\Demo;
    const FOO = 1;
    function foo() {}
    class foo
    {
        public function demo() {
            echo &#39;命名空间为:Test\Bar\Demo&#39;;
        }
    }
?>
ログイン後にコピー
<?php
    namespace Foo\Bar;
    include &#39;Demo.php&#39;;
    const FOO = 2;
    function foo() {
        echo &#39;Foo\Bar 命名空间下的 foo 函数<br>&#39;;
    }
    class foo
    {
        static function demo(){
            echo &#39;命名空间为:Foo\Bar<br>&#39;;
        }
    }
    /* 非限定名称 */
    foo();                  // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
    foo::demo();            // 解析为类 Foo\Bar\foo 的静态方法 staticmethod。
    echo FOO.&#39;<br>&#39;;        // 解析为常量 Foo\Bar\FOO
    /* 限定名称 */
    Demo\foo();             // 解析为函数 Foo\Bar\Demo\foo
    Demo\foo::demo();       // 解析为类 Foo\Bar\Demo\foo,
                            // 以及类的方法 demo
    echo Demo\FOO.&#39;<br>&#39;;   // 解析为常量 Foo\Bar\Demo\FOO
                                     
    /* 完全限定名称 */
    \Foo\Bar\foo();         // 解析为函数 Foo\Bar\foo
    \Foo\Bar\foo::demo();   // 解析为类 Foo\Bar\foo, 以及类的方法 demo
    echo \Foo\Bar\FOO.&#39;<br>&#39;; // 解析为常量 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート