>  기사  >  백엔드 개발  >  PHP 네임스페이스 정보

PHP 네임스페이스 정보

不言
不言원래의
2018-05-14 15:52:263837검색

이 글에서는 PHP의 네임스페이스에 대해 소개하는데, 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

PHP 네임스페이스란 무엇입니까?

PHP 매뉴얼: 넓은 의미에서 Space라는 이름은 사물을 캡슐화하는 방법. 이 추상화는 여러 곳에서 찾을 수 있습니다. 예를 들어 디렉터리는 운영 체제에서 관련 파일을 그룹화하는 데 사용되며 디렉터리에 있는 파일의 네임스페이스 역할을 합니다.

네임스페이스의 역할

1. 사용자가 작성한 코드와 PHP 내부 클래스/함수/상수 또는 타사 클래스/함수/상수 간의 이름 충돌.
2. 소스 코드의 가독성을 높이기 위해 매우 긴 식별자 이름(일반적으로 첫 번째 유형의 문제를 완화하기 위해 정의됨)에 대한 별칭(또는 짧은) 이름을 만듭니다.

Example

친구가 방금 이 사실을 알고 네임스페이스가 무엇인지 물었기 때문에 이 네임스페이스 기사를 썼습니다. 어떻게 하면 간단하게 설명하고 이해하기 쉽게 할 수 있을지 궁금했습니다. 아래에서는 네임스페이스에 대한 내 이해를 설명하기 위해 몇 가지 간단한 예를 사용하겠습니다.

1. 예제 1
먼저 두 개의 클래스 파일을 생성합니다
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

그런 다음 index.php 파일을 생성하여 위의 두 클래스를 소개하고 메소드 중에서 호출합니다. .
index.php

require_once("a.php");require_once("b.php");

이제 index.php 파일을 실행하면 치명적인 오류가 표시됩니다. 치명적인 오류: 클래스를 다시 선언할 수 없습니다. . . 분명히 Test 클래스는 두 번 도입했고 두 파일의 클래스 이름이 동일하여 충돌하기 때문에 다시 선언할 수 없습니다. 이때 이 문제를 해결하기 위해서는 네임스페이스가 필요하며, 용이하다.
2. 예제 2
이제 두 클래스 파일을 약간 수정합니다.
a.php

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

네임스페이스 키워드는 네임스페이스를 선언하는 데 사용됩니다. 이제 index.php를 실행하고 오류가 없는지 확인하세요. index.php를 수정하여 call
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3. 예제 3
이제 또 다른 상황이 있습니다. a.php Test 클래스를 여러 번 인스턴스화하는데, 매번 전체 네임스페이스 정보를 작성하는 것이 번거롭다면 어떻게 해야 할까요? 예를 들면:
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a_a = new a\test\Test();$a_b = new a\test\Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

오류는 없지만 매번 전체 네임스페이스 이름을 작성해야 하며 오류가 없으며 ctrl+c, ctrl+를 사용할 수 있습니다. v, 별로 아름답지 않아요(^_^).
이렇게 할 수 있습니다:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;$a = new Test();$a_a = new Test();$a_b = new Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

use 키워드는 클래스를 소개하는 데 사용되며 네임스페이스를 사용하여 특정 클래스의 사용을 나타냅니다. 나중에 작업을 직접 인스턴스화할 수 있습니다
4. 예제 5
다음과 같은 또 다른 문제가 발생합니다.
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

분명히 또 다른 치명적인 오류: 치명적인 오류: Cannot use btestTest as Test as the 이름이 이미 에서 사용 중입니다. . . 네임스페이스를 사용하더라도 두 클래스는 모두 Test이므로 프로그램은 두 번째 Test 클래스가 b.php의 Test 클래스라는 것을 알지 못합니다.
이런 식입니다. as:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test as BTest;$a = new Test();$b = new BTest();$a->test();$b->test();//页面输出:this is A class.this is B class.完美解决

as 키워드는 클래스 이름에 대한 별칭을 정의하여 동일한 클래스 이름과의 충돌을 효과적으로 방지할 수 있습니다.
5. 예제 6
다음은 또 다른 상황입니다. 먼저 몇 가지 코드 조각을 살펴보겠습니다. 이는 Yii2 프레임워크에 있으며 프레임워크와 아무 관련이 없습니다. 이 예제는 여러 곳에서 볼 수 있습니다.

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

여기서는 분명히 Yii 클래스가 사용되는데 왜 앞에 백슬래시가 있나요? 먼저 Yii 클래스를 추적해 보겠습니다. PHPstorm 편집기를 사용하는 경우 일부 학생들은 이를 추적하는 방법을 묻습니다. Ctrl을 누른 채 마우스로 클래스 이름을 클릭하면 이 클래스 파일로 이동합니다. PHPstorm 편집기 사용 방법은 다음을 확인하세요. PhpStorm 크랙 버전 및 사용 튜토리얼
다음은 Yii 클래스 파일 코드 조각입니다.

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

Yii 클래스에는 네임스페이스가 없습니다. 이 클래스를 사용하려면 클래스 앞에 백슬래시 ""를 추가해야 합니다. a.php와 동일한 수준의 전역 클래스 파일: c.php:

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

index.php 파일에서 이 작업을 수행하여 c.php

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;use b\test\Test as BTest;
$a = new Test();$b = new BTest();
$c = new \Test();
$a->test();$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

의 테스트 메서드를 호출합니다. 참고: 네임스페이스와 같은 키워드 사용 , 사용, as 및 전역 클래스 사용.

PHP 네임스페이스란 무엇인가요?

PHP 설명서: 광범위하게 말하면 네임스페이스는 사물을 캡슐화하는 방법입니다. 이 추상적인 개념은 여러 곳에서 찾아볼 수 있습니다. 예를 들어 디렉터리는 운영 체제에서 관련 파일을 그룹화하는 데 사용되며 디렉터리에 있는 파일의 네임스페이스 역할을 합니다.

네임스페이스의 역할

1. 사용자가 작성한 코드와 PHP 내부 클래스/함수/상수 또는 타사 클래스/함수/상수 간의 이름 충돌.

2. 소스 코드의 가독성을 높이기 위해 매우 긴 식별자 이름(일반적으로 첫 번째 유형의 문제를 완화하기 위해 정의됨)에 대한 별칭(또는 짧은) 이름을 만듭니다.

示例

写这个命名空间的文章是因为一个朋友刚学这个来问我命名空间到底是个什么东西。我在想怎么简单的描述出来并且很容易理解。下面我就以几个简单的小例子来说明一下我自己对命名空间的理解。

1. 例一
首先我们先建立两个类文件
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

再建立一个index.php文件,来引入以上两个类并调用其中的方法。
index.php

require_once("a.php");require_once("b.php");

现在运行index.php文件,你会发现有一个致命错误: Fatal error: Cannot redeclare class Test in。。。很显然,无法重新声明Test类,因为你引入了两次,而且两个文件中的类名称相同,冲突了。这个时候就需要命名空间来解决这个问题,并且很容易。
2. 例二
我们现在把两个类文件稍作修改。
a.php

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

namespace关键字是用来声明命名空间的。现在运行index.php发现没有错误,修改index.php进行方法调用测试
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3. 例三
现在有另外一种情况,比如我需要实例化a.php中的Test类多次,那么每次我们都需要命名空间信息完整写的话比较麻烦怎么办呢?比如:
index.php

require_once("a.php");
require_once("b.php");
$a = new a\test\Test();
$a_a = new a\test\Test();
$a_b = new a\test\Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

虽然也没有错误,但是你会发现比较麻烦,每次都需要全写命名空间名称,虽然不报错并且可以ctrl+c,ctrl+v,但是不太美观(^_^)。
你可以这样做:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
$a = new Test();
$a_a = new Test();
$a_b = new Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

use关键字是用来引入类,用命名空间的方式表示使用了某个类。后面就可以直接实例化操作
4. 例五
接下来另一个问题又来了,如下:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

很明显,又一个致命错误:Fatal error: Cannot use b\test\Test as Test because the name is already in use in 。。。因为虽然使用了命名空间,但是两个类名称相同,都是Test,程序不知道第二个Test类是b.php中的Test类,这时候你就用到了as关键字
如:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$a->test();$b->test();
//页面输出:
this is A class.this is B class.完美解决

as关键字是对类名称定义别名,可以有效防止类名称相同冲突
5. 例六
下面是另一种情况,我先给出几个代码片段,是Yii2框架中的,和框架无关,只是为了演示使用,很多地方都能见到此例。

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

很显然这里使用了一个Yii类,但是为什么前面又一个反斜杠”\”,我们先追踪一下Yii类,有的同学会问怎么追踪呢,如果你使用的是PHPstorm编辑器,直接按住Ctrl,鼠标点击类名就会跳到此类类文件中,关于怎么使用PHPstorm编辑器,请查看:PhpStorm破解版及使用教程
下面是Yii类文件代码段:

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

你会发现该Yii类并没有命名空间,我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\”
比如我们在a.php同级再建立一个全局类文件:c.php:

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

在index.php文件中这样做即可调用c.php中的test方法

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$c = new \Test();
$a->test();
$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

注意:namespace,use,as等关键字用法以及全局类的使用。

위 내용은 PHP 네임스페이스 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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