>  기사  >  백엔드 개발  >  PHP에서 네임스페이스 정의 및 사용(자세한 예)

PHP에서 네임스페이스 정의 및 사용(자세한 예)

WBOY
WBOY원래의
2021-10-25 15:29:164331검색

저번 글에서 "PHP 클래스 상속은 어떻게 받나요?"를 가져왔습니다. (요약 공유) "에서는 PHP 클래스의 상속 관련 지식을 자세히 소개하고 있습니다. 이번 글에서는 계속해서 PHP 네임스페이스 관련 지식을 살펴보도록 하겠습니다. 모든 분들께 도움이 되기를 바랍니다!

PHP에서 네임스페이스 정의 및 사용(자세한 예)

네임스페이스는 실제로 추상적인 개념입니다. 예를 들어, 우리 일상생활에서 디렉토리는 관련 파일을 그룹화하는 데 사용됩니다.

그래서네임스페이스란 무엇인가요? 사실 네임스페이스는 사물을 캡슐화하는 방법으로 이해될 수 있습니다. PHP에서 클래스, 함수, 상수는 같은 이름을 가질 수 없습니다. 세 가지 중 같은 이름의 문제를 해결하기 위해서입니다. , 네임스페이스를 사용해야 합니다.

PHP에서 네임스페이스는 주로 사용자가 작성한 코드와 PHP 내부 또는 타사 클래스, 함수 및 상수 간의 이름 지정 충돌을 해결하는 데 사용됩니다. 파일이 너무 많으면 이름이 중복될 가능성이 항상 있습니다. 긴 식별자 이름에 대해 매우 짧은 이름을 생성하면 코드의 가독성이 향상됩니다.

그럼 네임스페이스는 어떻게 선언, 즉 정의하고 사용하나요? 다음으로 네임스페이스를 정의하는 방법을 살펴보겠습니다!

네임스페이스 정의

PHP에서는 모든 올바른 코드가 네임스페이스에 포함될 수 있지만 클래스, 함수, 상수 및 기타 유형의 코드만 네임스페이스의 영향을 받습니다.

namespace 키워드를 사용하여 네임스페이스 정의를 완성합니다. 구문 형식은 다음과 같습니다. namespace关键字来完成命名空间的定义,它的语法格式如下:

namespace 命名空间名;

示例如下:

<?php  
// 定义代码在 &#39;named&#39; 命名空间中  
namespace named;    //在这里可以不使用大括号
 
// ... 代码 ...  
?>
  • 定义两个命名空间:

<?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() { /* ... */  }
?>

在上述事例中,创建了常量 MyProjectSubLevelCONNECT_OK,类 MyProjectSubLevelConnection 和函数 MyProjectSubLevelConnect

  • 在同一个文件中,定义多个命名空间

我们有两种语法格式可以在一个文件中定义多个命名空间,示例如下:

首先就是简单的语法组合

<?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中的我们不太清楚,但是文件系统我们可以总结出访问文件的三种方式:

相对文件名、相对路径名和绝对路径名。

PHP命名空间的元素只用同样的原理,例如命名空间下的类名可以通过三种方式引出:

  • 非限定名称,或不包含前缀的类名称,例如$a = new test()或者test,如果当前命名空间是currentnamespace,那么test将被解析为currentnamespacetest。如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为test。

  • 限定名称,或包含前缀名称,例如$a = new subnamespacetest(),如果当前命名空间是currentnamespace,则 test 会被解析为 currentnamespacesubnamespacetest,如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为subnamespacefoo

  • 完全限定名称,或包含了全局前缀操作符的名称,例如$a = new currentnamespacetest(),这种情况下,test 总是被解析为代码中的文字名 currentnamespacetest

下面是一个使用这三种方式的实例,我们需要两个 PHP 源文件,分别是 demo.php index.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

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 常量
?>
  • 🎜🎜두 개의 네임스페이스 정의: 🎜🎜🎜
rrreee
  • 🎜🎜Define sub -namespaces🎜 🎜
🎜PHP에서 네임스페이스 간의 관계는 디렉터리 및 파일과 매우 유사하므로 계층적 네임스페이스 이름을 지정할 수 있습니다. 따라서 네임스페이스의 이름은 계층적으로 정의할 수 있으며 구문 형식은 다음과 같습니다. 🎜🎜rrreee🎜예제는 다음과 같습니다. 🎜🎜rrreee🎜위 예에서는 상수 MyProjectSubLevelCONNECT_OK, 클래스 MyProjectSubLevelConnection 및 MyProjectSubLevelConnect🎜
  • 🎜🎜동일 파일에서 여러 네임스페이스를 정의합니다🎜🎜🎜
🎜두 가지 구문 형식이 있습니다. 하나에서 사용할 수 있습니다. 파일에는 여러 개의 네임스페이스가 정의되어 있습니다. 🎜🎜🎜첫 번째는 간단한 구문 조합입니다. 🎜🎜rrreee🎜그 다음에는 중괄호가 있습니다. {}🎜🎜rrreee🎜위의 소개를 통해 우리는 네임스페이스를 정의하는 방법은 이미 알고 있습니다. 네임스페이스를 정의하는 것만으로는 충분하지 않습니다. PHP에서 이를 사용하는 것이 더 중요하므로 네임스페이스를 사용하는 방법을 살펴보겠습니다. 🎜🎜🎜🎜네임스페이스 사용🎜🎜🎜🎜🎜네임스페이스 사용 방법을 이해하기 전에 PHP에서 사용할 네임스페이스의 요소를 아는 방법을 알아야 합니다. 이때 PHP에서 네임스페이스 요소 액세스의 원리를 알아야 합니다. 우선, 우리는 PHP에 대해 잘 모르지만 파일 시스템에서 파일에 액세스하는 세 가지 방법을 요약할 수 있습니다: 🎜🎜🎜상대 파일 이름, 상대 경로 이름 및 절대 경로 이름. 🎜🎜PHP 네임스페이스의 요소는 동일한 원칙만 사용합니다. 예를 들어 네임스페이스 아래의 클래스 이름은 세 가지 방법으로 도입될 수 있습니다: 🎜
  • 🎜 🎜정규화되지 않은 이름 🎜 또는 현재 네임스페이스가 currentnamespace인 경우 $a = new test() 또는 test와 같이 접두사가 없는 클래스 이름 , 그러면 테스트가 currentnamespacetest로 구문 분석됩니다. 테스트 코드가 전역 코드이고 네임스페이스에 코드가 포함되어 있지 않으면 테스트는 테스트로 구문 분석됩니다. 🎜
  • 🎜🎜정식 이름🎜 또는 접두사 이름 포함(예: $a = new subnamespacetest(), 현재 네임스페이스가 currentnamespace인 경우) 이면 테스트는 currentnamespacesubnamespacetest로 구문 분석됩니다. 테스트 코드가 전역이고 네임스페이스에 코드가 포함되어 있지 않으면 테스트는 subnamespacefoo로 구문 분석됩니다. 🎜
  • 🎜🎜정규화된 이름🎜 또는 전역 접두사 연산자를 포함하는 이름(예: $a = new currentnamespacetest()), 이 경우 test는 항상 다음으로 해결됩니다. 코드 currentnamespacetest의 리터럴 이름입니다. 🎜
🎜다음은 이 세 가지 방법을 사용하는 예입니다. 두 개의 PHP 소스 파일, 즉 demo.php index.php code>가 필요합니다. , 샘플 코드는 다음과 같습니다. 🎜rrreeerrreee🎜위의 예에서 전역 클래스, 함수 또는 상수에 액세스하려면 <code>strlen()과 같은 정규화된 이름을 사용할 수 있습니다. > 또는 예외 등. 🎜

别名、导入

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.