찾다
백엔드 개발PHP 튜토리얼PHP中的命名空间详细介绍_PHP教程

PHP中的命名空间详细介绍_PHP教程

Jul 13, 2016 am 09:47 AM
php기본소개하다이름기사공간상세한

PHP中的命名空间详细介绍

   这篇文章主要介绍了PHP中的命名空间详细介绍,本文讲解了命名空间(namespace)的概念、正在使用命名空间、定义命名空间、子命名空间、从命名空间中调用代码等内容,需要的朋友可以参考下

  概述

  PHP对于命名空间的支持,经历了一段艰难的旅程。幸运的是,PHP从5.3开始引入了命名空间。自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善。许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了。不管如何,每一种新特性的引入都有其目的,和其他语言一样,PHP引入命名空间也主要是为了解决名字冲突的问题。

  命名空间(namespace)的概念

   代码如下:

  当在字符串中使用命名空间名字的时候,一定不要忘了转义\

  可以将命名空间想象成一个抽屉,你可以在抽屉里放入铅笔、尺子、A4纸等,这些都是你自己的私有物品。在你的抽屉下面是别人的抽屉,别人也可以在抽屉里放入相同的物品。为了不拿错物品,你们决定在自己的抽屉上贴上标签,这样就可以清晰的看到某个物品是属于谁的了。

  之前,开发者必须在类、函数和常量中添加下划线,用来使自己的代码独立其他于代码库。这相当于所有人都给自己的物品贴上标签之后,一起放入了一个更大的抽屉里。尽管这也是一种组织代码的方式,但是这种方式是非常低效的。

  命名空间的到来就是为了解决这个问题。我们可以在不同的命名空间里声明相同的函数、类和常量,而不会造成名字上的冲突。本质上,命名空间无非是一种分等级标记PHP代码的方式。

  正在使用命名空间

  有一点需要注意的是,我们正在间接的使用命名空间。从PHP 5.3开始,所有在非用户定义的命名空间中的声明(类、函数、常量),都默认的属于全局命名空间。

  全局命名空间中包含了所有PHP内部的定义,如echo()、mysqli_connect()和Exception类。由于全局命名空间并没有独立的标识名,所以它经常被成为全局空间(global space)。

  定义命名空间

  命名空间的定义必须是PHP文件的第一条语句。唯一允许在定义命名空间之前使用的语句是declare语句。

  定义命名空间很简单,只需要使用关键字namespace即可。命名空间的名字需要遵循PHP文件中其他标识符的命名规则。

  下面是定义一个命名空间的示例:

   代码如下:

  namespace MyNamespace{

  class Test{

  }

  }

  如果想定义一个属于全局空间的代码块,也是使用namespace关键字,但是后面不加命名空间的名字,如下:

  代码如下:

  namespace {

  class Test{

  }

  }

  我们甚至可以在一个文件中定义多个命名空间,如下:

   代码如下:

  

  namespace MyNamespace {

  }

  namespace MySecondNamespace {

  }

  namespace {

  }

  我们也可以将一个命名空间分散在不同的文件中,文件包含的处理程序会自动合并他们。因此,限制大量的命名空间在同一个文件中定义是一个很好的编程实践,就像我们通常单独为每个类定义一个单独的文件一样。

  复制代码 代码如下:

  有一点需要注意的是,包含命名空间代码块的{是可选的,可以用也可以不用。事实上,只要我们坚持在一个文件中只定义一个命名空间,那么我们就可以完全省略{,这样也可以使我们的代码看起来更加简洁。

  子命名空间

  命名空间可以遵循一个特定的层级,就像我们电脑文件系统中得目录一样。子命名空间对于将一个项目结构化尤其特别有用。例如,你的项目需要访问数据库,你可能会想将所有数据库相关的代码(如数据库异常处理等)放在同一个子目录下。

  为了保持灵活性,将子命名空间放在子目录中是非常明智的做法。这会使你的代码结构更清晰,而且会使遵循PSR-0标准的autoloaders的使用变得更容易。

  PHP使用反斜线\作为命名空间的分隔符,有趣的是,PHP甚至考虑过使用笑脸:)作为命名空间的分隔符。

  子命名空间定义示例:

  代码如下:

  

  namespace MyProject\Database

  class Connection {

  }

  可以使用尽可能多的子命名空间:

   代码如下:

  

  namespace MyProject\Blog\Auth\Handler\Social;

  class Twitter {

  }

  有一点需要注意的是,PHP并不支持命名空间的嵌套定义,下面的代码会导致一个致命错误:Namespace declarations cannot be nested。

   代码如下:

  

  namespace MyProject {

  namespace Database {

  class Connection { }

  }

  }

  从命名空间中调用代码

  如果你想在不同的命名空间中实例化一个类、调用一个函数或者使用常量,需要使用反斜线\。他们可以从三个角度被解析:

  1.未限定的名字

  2.限定的名字

  3.完全限定的名字

  未限定的名字(Unqualified Name)

  这是一个类的名称,函数或常量,但是不包括任何命名的引用。如果命名空间对你来说还比较陌生,那么这就是你熟悉的角度。

   代码如下:

  

  namespace MyProject;

  class MyClass {

  static function static_method()

  {

  echo 'Hello, world!';

  }

  }

  // Unqualified name, resolves to the namespace you are currently in (MyProject\MyClass)

  MyClass:static_method();

  限定的名字(Qualified Name)

  这是我们如何使用子命名空间的方式。示例如下:

  代码如下:

  

  namespace MyProject;

  require 'myproject/database/connection.php';

  // Qualified name, instantiating a class from a sub-namespace of MyProject

  $connection = new Database\Connection();

  完全限定的名字(Fully Qualified Name)

  前面所说的使用限定的名字和未限定的名字,都是相对于当前所处的命名空间来说的。以上两种方式仅可以被用来访问当前所处的命名空间和更深层次的子命名空间。

  如果想访问一个在比前命名空间更高的层级,那么就需要使用完全限定的名字—一个绝对路径而不是相对路径。这可以归结为在命名空间的最前面加反斜杠\。使用完全限定的名字可以让PHP知道,这次调用是从全局空间开始的,而不是相对于当前所处的命名空间。示例如下:

  代码如下:

  

  namespace MyProject\Database;

  require 'myproject/fileaccess/input.php';

  // Trying to access the MyProject\FileAccess\Input class

  // This time it will work because we use the fully qualified name, note the leading backslash

  $input = new \MyProject\FileAccess\Input();

  对于PHP的内部函数来说,我们不必要使用完全限定的名字。在当前所处的命名空间中,调用一个不存在的未限定的名字的类或函数,PHP会搜索全局空间。

  记住了这个规则,我们就可以像下面那样重写PHP的内部函数:

   代码如下:

  

  namespace MyProject;

  var_dump($query); // Overloaded

  \var_dump($query); // Internal

  // We want to access the global Exception class

  // The following will not work because there's no class called Exception in the MyProject\Database namespace and unqualified class names do not have a fallback to global space

  // throw new Exception('Query failed!');

  // Instead, we use a single backslash to indicate we want to resolve from global space

  throw new \Exception('ailed!');

  function var_dump() {

  echo 'Overloaded global var_dump()!
';

  }

  动态调用

  PHP是一门动态语言,也可以将PHP的这种特性用来调用命名空间。这在本质上与实例化一个变量类和包含一个变量文件是相同的。在字符串中,PHP使用的命名空间分隔符(\)也是一个元字符,因此需要转义。

   代码如下:

  

  namespace OtherProject;

  $project_name = 'MyProject';

  $package_name = 'Database';

  $class_name = 'Connection';

  // Include a variable file

  require strtolower($project_name . '/'. $package_name . '/' . $class_name) . '.php';

  // Name of a variable class in a variable namespace. Note how the backslash is escaped to use it properly

  $fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $class_name;

  $connection = new $fully_qualified_name();

  namespace关键字

  关键字namespace不仅仅可以用来定义一个命名空间,它也可以用来显示的表示当前命名空间,它此时的作用相当于类中的self关键字。

   代码如下:

  

  namespace MyProject;

  function run()

  {

  echo 'Running from a namespace!';

  }

  // Resolves to MyProject\run

  run();

  // Explicitly resolves to MyProject\run

  namespace\run();

  __NAMESPACE__常量

  就像self关键字不能表示当前类的名字一样,namespace关键字也不能用来表示当前命名空间的名字。__NAMESPACE__关键字就是用来解决这个问题的。

  代码如下:

  

  namespace MyProject\Database;

  // 'MyProject\Database'

  echo __NAMESPACE__;

  这个关键字对于判断当前代码是否从命名空间开始时非常有用,而且也可以用来调试代码。

  导入或别名

  PHP中得命名空间也支持导入,导入也被成为别名。只有类、接口和命名空间可以被导入(别名)。导入是命名空间中一个非常有用和基础的功能。它使我们可以使用外部的代码包,而不用担心名字的冲突。使用use关键字可以实现导入功能。也可以使用as关键字,在导入的时候指定一个别名。

   代码如下:

  use [name of class, interface or namespace] as [optional_custom_alias]

  一个完全限定的名字可以用一个未限定的别名来代替,这样我们就不用在每次使用的时候都使用完全限定的名字,达到简化代码的目的。导入应该在命名空间的最高层或者全局空间中使用,在函数作用域内使用导入功能是非法的语法。

   代码如下:

  

  namespace OtherProject;

  // This holds the MyProject\Database namespace with a Connection class in it

  require 'myproject/database/connection.php';

  // If we want to access the database connection of MyProject, we need to use its fully qualified name as we're in a different name space

  $connection = new \MyProject\Database\Connection();

  // Import the Connection class (it works exactly the same with interfaces)

  use MyProject\Database\Connection;

  // Now this works too! Before the Connection class was aliased PHP would not have found an OtherProject\Connection class

  $connection = new Connection();

  // Import the MyProject\Database namespace

  use MyProject\Database;

  $connection = new Database\Connection()

  我们可以通过使用别名来简化上面的代码:

   代码如下:

  

  namespace OtherProject;

  require 'myproject/database/connection.php';

  use MyProject\Database\Connection as MyConnection;

  $connection = new MyConnection();

  use MyProject\Database as MyDatabase;

  $connection = new MyDatabase\Connection();

  总结

  命名空间是用来避免定义冲突,并且为代码引入了更加灵活和组织的方式。有一点需要注意的时,我们并没有义务去使用命名空间,它是和面向对象结合使用的一种工作方式。但是,如果使用了命名空间,我们的代码可能会达到一种新的层次,逼格也会显得更高吧。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1025900.htmlTechArticlePHP中的命名空间详细介绍 这篇文章主要介绍了PHP中的命名空间详细介绍,本文讲解了命名空间(namespace)的概念、正在使用命名空间、定义命名...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 다차원 배열에서 총 요소 수를 계산하는 방법은 무엇입니까?PHP 다차원 배열에서 총 요소 수를 계산하는 방법은 무엇입니까?May 15, 2025 pm 09:00 PM

PHP 다차원 어레이에서 총 요소 수를 계산하는 것은 재귀 적 또는 반복적 인 방법을 사용하여 수행 할 수 있습니다. 1. 재귀 방법은 배열을 가로 지르고 중첩 배열을 재귀 적으로 처리함으로써 계산됩니다. 2. 반복 방법은 스택을 사용하여 깊이 문제를 피하기 위해 재귀를 시뮬레이션합니다. 3. Array_Walk_Recursive 함수도 구현할 수 있지만 수동 계산이 필요합니다.

PHP에서 DO-While 루프의 특성은 무엇입니까?PHP에서 DO-While 루프의 특성은 무엇입니까?May 15, 2025 pm 08:57 PM

PHP에서, do-while 루프의 특성은 루프 본체가 적어도 한 번 실행되도록하고 조건에 따라 루프를 계속할지 여부를 결정하는 것입니다. 1) 조건부 점검 전에 루프 본체를 실행하며, 사용자 입력 확인 및 메뉴 시스템과 같이 작업을 적어도 한 번 수행 해야하는 시나리오에 적합합니다. 2) 그러나, do-while 루프의 구문은 초보자들 사이에서 혼란을 야기 할 수 있으며 불필요한 성능 오버 헤드를 추가 할 수 있습니다.

PHP에서 문자열을 해시하는 방법은 무엇입니까?PHP에서 문자열을 해시하는 방법은 무엇입니까?May 15, 2025 pm 08:54 PM

PHP의 효율적인 해싱 스트링은 다음 방법을 사용할 수 있습니다. 1. 빠른 해싱에 MD5 기능을 사용하지만 비밀번호 저장에는 적합하지 않습니다. 2. SHA256 기능을 사용하여 보안을 향상시킵니다. 3. Password_hash 함수를 사용하여 비밀번호를 처리하여 최고 보안과 편의성을 제공하십시오.

PHP에서 배열 슬라이딩 윈도우를 구현하는 방법은 무엇입니까?PHP에서 배열 슬라이딩 윈도우를 구현하는 방법은 무엇입니까?May 15, 2025 pm 08:51 PM

PHP에서 배열 슬라이딩 윈도우 구현 기능은 SlideWindow 및 SlideWindowAverage 기능으로 수행 할 수 있습니다. 1. Slide-Window 함수를 사용하여 배열을 고정 크기 서브 어레이로 분할하십시오. 2. SlideWindowAverage 함수를 사용하여 각 창의 평균 값을 계산하십시오. 3. 실시간 데이터 스트림의 경우, 비동기 처리 및 이상치 감지를 Reactphp를 사용하여 사용할 수 있습니다.

PHP에서 __clone 방법을 사용하는 방법은 무엇입니까?PHP에서 __clone 방법을 사용하는 방법은 무엇입니까?May 15, 2025 pm 08:48 PM

PHP의 __clone 방법은 객체 클로닝시 사용자 정의 작업을 수행하는 데 사용됩니다. 클론 키워드를 사용하여 객체를 클로닝 할 때 객체에 __ 클론 메소드가있는 경우 방법이 자동으로 호출되어 클로닝 프로세스 중에 클로닝 된 객체의 독립성을 보장하기 위해 참조 유형 속성을 재설정하는 것과 같은 클로닝 프로세스 중에 맞춤형 처리가 가능합니다.

PHP에서 GOTO 명령문을 사용하는 방법?PHP에서 GOTO 명령문을 사용하는 방법?May 15, 2025 pm 08:45 PM

PHP에서 GOTO 진술은 프로그램의 특정 태그로 무조건 점프하는 데 사용됩니다. 1) 복잡한 중첩 루프 또는 조건부 명세서의 처리를 단순화 할 수 있지만 2) GOTO를 사용하면 코드를 이해하고 유지하기가 어렵게 만들 수 있으며 3) 구조화 된 제어 문의 사용에 우선 순위를 부여하는 것이 좋습니다. 전반적으로, GOTO는 조심스럽게 사용해야하며 모범 사례를 따라 코드의 가독성과 유지 보수 가능성을 보장합니다.

PHP에서 데이터 통계를 구현하는 방법은 무엇입니까?PHP에서 데이터 통계를 구현하는 방법은 무엇입니까?May 15, 2025 pm 08:42 PM

PHP에서 내장 기능, 사용자 정의 기능 및 타사 라이브러리를 사용하여 데이터 통계를 달성 할 수 있습니다. 1) array_sum () 및 count ()와 같은 내장 함수를 사용하여 기본 통계를 수행하십시오. 2) 중앙값과 같은 복잡한 통계를 계산하기 위해 사용자 정의 기능을 작성하십시오. 3) PHP-ML 라이브러리를 사용하여 고급 통계 분석을 수행하십시오. 이러한 방법을 통해 데이터 통계를 효율적으로 수행 할 수 있습니다.

PHP에서 익명 기능을 사용하는 방법은 무엇입니까?PHP에서 익명 기능을 사용하는 방법은 무엇입니까?May 15, 2025 pm 08:39 PM

예, PHP의 익명 함수는 이름이없는 함수를 나타냅니다. 다른 함수의 매개 변수로 전달되고 함수의 리턴 값으로 전달 될 수있어 코드를보다 유연하고 효율적으로 만듭니다. 익명 기능을 사용하는 경우 범위 및 성능 문제에주의를 기울여야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경