이번에는 php 네임스페이스 사용에 대한 자세한 설명을 들고 왔고, php 네임스페이스 사용 시 주의사항은 무엇인지 살펴보겠습니다.
네임스페이스로 해결된 문제(설명서도 매우 명확하게 작성되었으며 아래 내 이해에 따라 단순화되었습니다.):
1: 프로그램 작성자가 직접 작성한 클래스, 상수, 함수 및 PHP 내부 또는 제3자가 작성한 함수의 출현 해결 당사자 이름 충돌 상황.
2: 클래스, 상수, 함수의 이름이 너무 긴 문제를 해결하고 코드의 가독성을 높이는 데 도움이 되는 별칭을 만듭니다. 또한 일반적으로 첫 번째 유형의 문제를 완화하면 이름이 너무 길어지는 문제가 발생합니다.
1: 네임스페이스는 네임스페이스 키워드로 선언됩니다. 동시에 네임스페이스는 PHP가 아닌 코드 및 공백 문자를 포함한 다른 코드 앞에 위치해야 합니다(선언 키워드 제외). php), 그렇지 않으면 치명적인 오류가 발생합니다.
예:
<?php namespace Index; ?>
참고 1: 네임스페이스 앞에 코드나 공백이 없는데도 여전히 치명적인 오류가 발생하는 경우 BOM 헤더로 인해 발생한 것입니다.
참고 2: 모든 합법적인 PHP 코드는 네임스페이스 아래에 배치될 수 있지만 네임스페이스의 영향을 받는 유일한 클래스(추상 클래스 및 특성)와 인터페이스, 상수 및 함수는 다음과 같습니다.
2: 디렉터리와 파일 간의 관계와 마찬가지로 PHP 네임스페이스를 사용하면 계층적 네임스페이스 이름을 지정할 수도 있습니다. 따라서 네임스페이스 이름은 .
예:
<?php namespace Index\Col\File; define('MESSAGE','hello world'); ?>
3: 하나의 파일에 여러 개의 네임스페이스를 정의할 수 있습니다. 두 가지 정의 구문이 있는데, 하나는 단순 조합 구문이고, 다른 하나는 중괄호 구문입니다. 다른 파일은 여러 이름을 정의합니다. 공백 사용은 일반적으로 다음과 같습니다. 여러 파일이 하나의 파일로 병합되는 시나리오이지만 꼭 필요한 경우가 아니면 코드가 복잡해지고 가독성이 떨어지기 때문에 이 방법을 사용하지 않는 것이 가장 좋습니다 .
간단한 조합 구문:
<?php namespace Index; const INSTANCE=1; namespace Col; const INSTANCE=2; ?>
Braces 구문, 하나의 파일에 여러 개의 네임스페이스가 있습니다. 네임스페이스가 아닌 코드를 작성해야 하는 경우 중괄호 구문만 사용할 수 있으며, 네임스페이스가 아닌 코드는 네임스페이스를 사용하여 이름이 지정되지 않은 네임스페이스를 선언합니다. , 다음 중괄호를 사용하세요.
<?php /*命名空间Index*/ namespace Index{ const INSTANCE=1; } /*命名空间Col*/ namespace Col{ const INSTANCE=2; } /*全局非命名空间代码*/ namespace { const INSTANCE=3; } ?>
4: 여러 개의 서로 다른 파일이 동일한 네임스페이스를 정의할 수 있습니다. 즉, 동일한 네임스페이스의 콘텐츠가 여러 개의 서로 다른 파일에 저장될 수 있습니다.
네임스페이스 사용 원칙이 사용되는 경우는 세 가지가 있습니다. 실제로는 설명서에 자세히 설명되어 있지만 번역 문제로 인해 약간의 혼란이 생길 수 있습니다. 여기서는 단순화하여 직접 사용하겠습니다. 정리하는 예:
1: 한정된 이름이 없습니다. 즉, 읽어들이려는 클래스, 상수, 함수, 인터페이스 이름을 그대로 사용합니다. 이 경우에는 클래스, 상수, 함수, 인터페이스 이름을 사용합니다. 내용이 속한 네임스페이스의 이름을 읽어오지만, 네임스페이스에 관련 이름이 없는 경우 데이터가 클래스 또는 인터페이스 이름인 경우 치명적인 오류가 반환됩니다. 함수 또는 상수, 전역 함수 및 상수는 자동으로 읽혀집니다. 전역 함수와 상수가 없으면 치명적인 오류가 보고됩니다.
다음 예:
<?php /*全局非命名空间代码*/ namespace { const INSTANCE=1; function test(){ echo 1; } class foo{ static function fool(){ echo 1; } } var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //输出1 } /*命名空间Index*/ namespace Index{ const INSTANCE=2; function test(){ echo 2; } class foo{ static function fool(){ echo 2; } } var_dump(INSTANCE); //打印出来的是2 test(); //输出2 foo::fool(); //输出2 } /*命名空间Col*/ namespace Col{ const INSTANCE=3; function test(){ echo 3; } class foo{ static function fool(){ echo 3; } } var_dump(INSTANCE); //打印出来的是3 test(); //输出2 foo::fool(); //输出2 } ?>
위 예에서 각 네임스페이스 출력에는 정규화된 이름이 없으므로 현재 네임스페이스에 설정된 해당 데이터 값을 가져옵니다.
현재 네임스페이스에 설정이 없으면 함수와 상수는 전역적으로 설정된 해당 데이터 값을 읽습니다. 치명적인 오류는 해당 전역 설정이 없는 경우에만 보고됩니다. 클래스와 인터페이스는 치명적인 오류를 직접 보고합니다. 다음 코드에 나와 있습니다.
<?php /*全局非命名空间代码*/ namespace { const INSTANCE=1; function test(){ echo 1; } class foo{ static function fool(){ echo 1; } } var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //输出1 } /*命名空间Index*/ namespace Index{ var_dump(INSTANCE); //打印出来的是1 test(); //输出1 foo::fool(); //fatal error } ?>
2: 한정된 이름은 두 가지 상황으로 나누어집니다. 하나는 접두사를 포함하는 한정된 이름의 경우이고, 다른 하나는 전역 한정된 이름을 포함하는 경우입니다. 매뉴얼에서는 이 두 가지 유형을 별도로 분리하지만 이 두 가지를 함께 결합할 수 있다고 생각합니다. 둘 다 한정된 이름을 가지고 있지만 전자는 글로벌 한정을 갖고 있지 않은 반면 후자는 글로벌 한정을 가지고 있습니다.
① 접두사를 포함하는 정규화된 이름입니다. 이 접두사는 여러 개 또는 하나의 수준을 가질 수 있지만 가장 왼쪽은 전역 한정자가 될 수 없습니다. 이 경우 코드가 위치한 네임스페이스에 해당하는 데이터에 접두사 한정 이름이 추가됩니다. , 즉:
所处命名空间\前缀限定\名称来读取,如果该代码是全局没有命名空间的,则直接用前缀限定名称来读取,也就是:前缀限定\名称来读取。
实例代码:
<?php /*命名空间Col\Index*/ namespace Col\Index{ const INSTANCE=1; } /*命名空间Index*/ namespace Index{ const INSTANCE=2; } /*命名空间Col*/ namespace Col{ const INSTANCE=3; var_dump(Index\INSTANCE); //打印出来的是1 读取的是Col\Index\INSTANCE } /*全局非命名空间代码*/ namespace { const INSTANCE=4; var_dump(Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } ?>
②全局限定前缀名称:也就是在最左侧有全局操作符\进行修饰的前缀限定名称,当然也可以没有前缀限定直接全局操作符\加上名称也是可以的。但加上全局操作符后就跟目录里的绝对路径一样,只会按照全局限定后的所设置的进行读取。
具体实例如下:
<?php /*命名空间Col\Index*/ namespace Col\Index{ const INSTANCE=1; } /*命名空间Index*/ namespace Index{ const INSTANCE=2; } /*命名空间Col*/ namespace Col{ const INSTANCE=3; var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } /*全局非命名空间代码*/ namespace { const INSTANCE=4; var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE } namespace Lin{ const INSTANCE=5; var_dump(\INSTANCE); //打印出来的是4 读取的是INSTANCE,是全局非命名空间里的INSTANCE,如果没有全局操作符\,读取的会是当前命名空间的Lin\INSTANCE=5 } ?>
有时候命名空间会放在字符串中使用,如果是单引号不会通过编译器解释,所以没有任何问题,但是如果是双引号,那么就会有些意外情况了,要知道双引号里的内容是需要经过编译器进行解释然后再进行输出的,而\在编译器里的解释容易造成歧义。
例如"index\name"这里就有\n会被解释成换行,除此之外还有很多这种造成意外的情况。
因此一般我们推荐命名空间如果要放在字符串中使用,最好使用单引号,一是效率,二是安全,如果使用双引号,则必须增加一个\进行转义避免歧义,例如"index\\name"这样就没有问题了。
随手双引号的举个例子:
<?php /*全局非命名空间代码*/ namespace Index\Name{ class foo{ function construct(){ echo 2; } } } namespace{ $a= "Index\\Name\\foo"; //用\转义了\所以可以正常运行,但是如果去掉转义的话会报错Class 'Index\Nameoo',因为/f被解释成了换页符 $obj=new $a; }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 PHP 네임스페이스 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!