Namespace가장 명확한 목적 중 하나는 중복 이름 문제를 해결하는 것입니다. PHP는 두 함수나 클래스가 동일한 이름을 갖는 것을 허용하지 않습니다. 그렇지 않으면 치명적인 오류가 발생합니다. 이런 경우에는 이름 중복만 피하면 해결이 됩니다. 가장 일반적인 방법은 접두사에 동의하는 것입니다.
예: 프로젝트에는 기사와 게시판이라는 두 가지 모듈이 있습니다. 각 모듈에는 사용자 댓글을 처리하는 Comment 클래스가 있습니다. 나중에 모든 사용자 메시지에 대한 일부 정보 통계 기능을 추가하고 싶을 수도 있습니다. 예를 들어 모든 메시지 수를 가져오고 싶습니다. 이때 해당 Comments에서 제공하는 메서드를 호출하는 것이 좋지만 동시에 해당 Comment 클래스를 도입하는 것은 불가능하며 코드에서 오류가 발생하고 다른 위치에 있는 Comment를 다시 작성하는 것도 불가능합니다. 유지보수성을 줄입니다. 그런 다음 클래스 이름만 리팩터링할 수 있습니다. 명명 규칙에 동의하여 다음과 같이 클래스 이름 앞에 모듈 이름을 추가합니다. Article_Comment, MessageBoard_Comment
보시다시피 이름이 매우 길어집니다. 앞으로는 더 많은 코드(적어도 더 많은 문자)가 작성될 것입니다. 또한, 향후 각 모듈에 더 많은 통합 기능을 추가하거나 서로 호출하려는 경우 중복된 이름이 발생할 경우 이름을 재구성해야 합니다. 물론 프로젝트 초기에 이 문제를 인지하고 명명 규칙을 지정하면 이 문제를 피할 수 있습니다. 또 다른 해결책은 네임스페이스를 사용하는 것입니다.
네임스페이스를 선언할 때 중괄호에는 변수뿐만 아니라 다음 유형도 포함될 수 있습니다.
변수(초기화 가능)
상수
함수(정의 또는 선언 가능)
구조
class
template
namespace(네임스페이스는 중첩 정의 가능)
namespace사용 요약:
팁: 다음 예에는 Demo.php, index.php, 두 개의 파일이 있습니다. 동일한 디렉토리에 Demo.php 파일에 namespace 및 Demo 클래스를 작성하면 index.php는 Demo.php의 Demo 클래스를 호출합니다. 다음 예에서 "출력 결과"는 브라우저가 index.php에 액세스함을 의미합니다.
간단한 예
Demo.php 파일 코드
<?php namespace DemoNameSpace; class Demo { private $mysqlHandle; public function construct(){ echo 'This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is '.NAMESPACE; }}?>
index.php 파일 코드
<?php include 'Demo.php'; use DemoNameSpace\Demo; $DemoObj = new Demo(); ?>
출력 결과 1: "이것은 PHP 데모의 네임스페이스입니다. 데모 매직 상수 "NAMESPACE"는 DemoNameSpace입니다."
위 설명 예: Demo.php에는 _NAMESPACE 매직 상수가 있습니다. "현재 네임스페이스 이름의 문자열이 포함되어 있습니다. 전역적으로는 어떤 네임스페이스 코드에도 포함되지 않으며 빈 문자열이 포함되어 있습니다."
Demo.php는 아무것도 변경하지 않지만 index.php 파일을 다음과 같이 변경합니다.
<?php include 'Demo.php'; $Demo = new Demo(); ?>
출력 결과 2: "치명적인 오류: 4행의 F:JJserverdemoindex.php에서 'Demo' 클래스를 찾을 수 없습니다."
일반적인 "치명적인 오류" 메시지입니다. 기존 PHP 프로그래밍 아이디어에 따르면 여기 출력은 "출력 결과 1"과 일치해야 하지만 여기에는 치명적인 오류가 있습니다. ~
좋습니다. 먼저 문제를 해결하고 Demo.php 파일에서 "namespace DemoNameSpace;" 문을 제거(또는 주석 처리)하면 정상적으로 됩니다. 이는 우리가 일반적으로 클래스를 작성하고 클래스를 호출하는 가장 일반적인 방법입니다. 네임스페이스를 사용하지 않고서는 이 상황을 설명하지 않겠습니다.
네임스페이스를 사용하는 경우와 사용하지 않는 경우의 두 가지 출력 상황을 비교하고 이해하기 위해 네임스페이스 정의를 추가하면 위의 치명적인 오류 상황을 쉽게 이해할 수 있습니다. Demo.php에 네임스페이스가 정의되어 있습니다. 즉, 네임스페이스 뒤에 Demo 클래스가 정의되고 Demo 클래스가 DemoNameSpace 네임스페이스에 병합되므로 이 Demo 클래스를 호출하려면 먼저 이 DemoNameSpace를 호출해야 합니다. 즉, index.php 파일의 "useDemoNameSpaceDemo" 문을 사용합니다.
두 번째, 좀 더 복잡한 예
Demo.php 파일 코드
<?php namespace DemoNameSpace; class Demo { private $mysqlHandle; public function construct(){ echo 'This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is '.NAMESPACE; }} namespace DemoNameSpace1; const constDefine = 'JJonline1'; class Demo { private $mysql; const constDefine = 'JJonline2'; public function construct() { echo 'The const constant outside class is: '.constDefine; echo '===cut-off rule of god!!!!==='; echo 'The const constant inside class is: '.self::constDefine; }}?>
index.php 파일 코드
<?php include 'Demo.php'; use DemoNameSpace1\Demo as Test; $Demo = new Test(); echo '||||'.DemoNameSpace1\constDefine;?>
출력 결과 3: "클래스 외부의 const 상수는 JJonline1===신의 컷오프 규칙입니다!! !!===클래스 내부의 const 상수는 다음과 같습니다: JJonline2||||JJonline1”
这个结果在没有命名空间的时候,就直接报诸如“Fatal error: Cannot redeclare class Demo”的致命错误了。但运行没有报错,这也就是php5.3以后引入的命名空间的好处了,就诸如本文开头引用的官方解释中以不同目录下的相同文件名的文件可以存在一样是一个道理了。Demo.php文件中,定义的第一个名称叫做Demo的class类被归并到了DemoNameSpace的命名空间,而定义的第二个名称叫做Demo的class被归并到了DemoNameSpace1的命名空间,故而并不会出现不能重复定义某一个类的致命错误。以上的书写方法是要尽量避免的,因为类外部const常量名与类内部const常量名是一样的,很容易混淆,这里这样书写的目的就是看看不同位置申明的const常量,在调用时的情况;输出结果3已经很明显了,就不再多墨迹解释了。
Demo.php中DemoNameSpace1命名空间下还将const常量constDefine提出,拿到了定义class之外,这又要抓狂了,因为之前的知识是define定义全局常量,const定义class内部常量;这儿却将const拿出来玩了...具体就不再讲解了,Demo.php文件代码以及运行后的结果已经很明确的表明了相关知识。class内部定义的const只能在class的内部调用,采用self::constName形式,而class内部调用命名空间下、class外的const常量,则可以直接使用诸如define定义的常量一样使用。当需要使用该命名空间下、class外定义的const常量时,就使用类似路径形式的方式调用(index.php文件中的输出)。
该例子还有一点说明,就是在index.php中使用了use as语句,看index.php的代码,意义一目了然,new的一个class名称叫Test,但Test这个类并没有在Demo.php中定义,却没有出错,这就在于了use as语句了,具体意义不再解释。
通过上述的了解,namespace关键字可以将实现各种功能的class通过指定不同的命名空间分门别类存放,而且不同命名空间下的class可以同名;另外const常量定义也可以提出到class外部,当然也会有作用范围这么一个“内涵”~
总结下namespace的相关知识:
1、当前脚本文件的第一个命名空间前面不能有任何代码,例如如下代码就是会报致命错误的:
<?php define("GREETING","Hello world!"); namespace DemoNameSpace; class Demo { private $mysqlHandle; public function construct() { echo 'This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is '.NAMESPACE; }} $Demo = new Demo(); ?>
运行上述代码,会出现致命错误:“Fatal error: Namespace declaration statement has to be the very first statement in xxxx”
2、命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。例如如下代码是可以运行的
<?php namespace DemoTest; class Demo { public function construct() { echo 'this is a test script'; }} namespace DemoNameSpace; class Demo { private $mysqlHandle; public function construct() { echo 'This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is '.NAMESPACE; }}$ Demo = new Demo(); ?>
运行结果4:“This is namespace of PHP demo ,The Demo magic constant "NAMESPACE" is DemoNameSpace”
这个结果表明,同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class
3、公共空间:可以简单的理解,没有定义命名空间的方法(函数)、类库(class)、属性(变量)都默认归属于公共空间。这样就解释了为php5.3.0以前版本书写的代码大部分为何在php5.3.0及其以上版本还能正常运行的原因。另外:公共空间中的代码段被引入到某个命名空间下后,该公共空间中的代码段不属于任何命名空间!
命名空间的引入,让php面向对象编程更加的贴切,合理利用命名空间,也可以让项目文件规划,以上就是介绍命名空间的所有内容。
相关推荐:
위 내용은 네임스페이스란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!