正在定名空间提出以前,没有同的组件很容易碰着定名的抵触,例如 Request 、Response 等常见的定名。PHP 正在 5.3 后提出了定名空间用来处理组件之间的定名抵触成绩,次要参考了文件零碎的设计:
同一个目次下没有容许有相反的文件名 - 同一个定名空间下没有容许有相反的类;
没有同的目次能够有同名文件 - 没有同的定名空间能够有相反的类;
界说
应用 namespace 要害字来界说一个定名空间。此中,顶层定名空间一般是厂商名,没有同开发者的厂商定名空间是惟一的。定名空间没有需求与文件目次逐个对应,然而最佳恪守 PSR-4 标准。
<?php namespace Symfony\Component\HttpFoundation; class Request { }
定名空间必需正在一切代码以前申明,惟一的破例就是 declare 要害字。
<?php declare(strict_types=1); namespace App;
定名空间内可蕴含恣意 PHP 代码,然而仅对类 (包罗形象类以及 Trait)、接口、函数以及常量这四品种型失效。
<?php namespace MyProject; const CONNECT_OK = 1; class FOO {} interface Foo{} function foo() {}
应用
应用 use 要害字来引入定名空间
<?php namespace App; use Symfony\Component\HttpFoundation\Request; use Foo\Bar; class Test { public function run() { $bar = new Bar(); } }
界说以及应用保举遵照 PSR-2 的标准
namespace 之后必需存正在一个空行;
一切 use 申明必需位于 namespace 申明之后;
每一条 use 申明必需只有一个 use 要害字。
use 语句块之后必需存正在一个空行。
当 use 引入的类呈现同名时,可以使用 as 来界说别号
<?php namespace App; use Foo\Bar as BaseBar; class Bar extends BaseBar { }
限定符
除了了应用 use 外,还能够间接应用 \ 限定符来进行解析,规定很简略:假如含有 \ 前缀则代表从全局定名空间开端解析,不然则代表从以后定名空间开端解析。
<?php namespace App; \Foo\Bar\foo(); // 解析成 \Foo\Bar\foo(); Foo\Bar\foo(); // 解析成 App\Foo\Bar\foo();
此规定也实用于函数、常量等
$a = \strlen('hi'); // 挪用全局函数 strlen $b = \INI_ALL; // 拜访全局常量 INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception
有两个需求特地留意之处:
关于函数以及常量而言,假如以后定名空间没有存正在,则会主动去全局定名空间去寻觅,因而可省略 \ 前缀。关于类而言,假如以后定名空间解析没有到,没有会去全局空间寻觅,因而,不成省略 \
$a = strlen('hi'); $b = INI_ALL; $c = new Exception('error'); // 谬误 $c = new \Exception('error'); // 正确
当静态挪用定名空间时,该定名空间始终会被当成是全局定名空间,因而能够省略前缀 \
$class1 = 'Foo\Bar'; $object1 = new $class1; // 始终被解析成 \Foo\Bar
正在外部拜访定名空间
PHP 支持两种形象的拜访以后定名空间外部元素的办法,__NAMESPACE__ 魔术常量以及 namespace 要害字。
__NAMESPACE__ 常量的值是蕴含以后定名空间称号的字符串,假如是正在全局定名空间,则前往空字符串。
<?php namespace MyProject; function get($classname) { $a = __NAMESPACE__ . '\\' . $classname; return new $a; }
要害字 namespace 可用来显式拜访以后定名空间或子定名空间中的元素。它等价于类中的 self 操作符
namespace App; use blah\blah as mine; blah\mine(); // App\blah\mine() namespace\blah\mine(); // App\blah\mine() namespace\func(); // App\func() namespace\sub\func(); // App\sub\func() namespace\cname::method(); // App\cname::method() $a = new namespace\sub\cname(); // App\sub\cname $b = namespace\CONSTANT; // App\CONSTANT
本义 \ 符号
别的,保举对一切的 \ 进行本义,防止呈现不成预期的结果
$class = "dangerous\name"; // \n 被解析成换行符 $obj = new $class; $class = 'dangerous\name'; // 正确,然而没有保举 $class = 'dangerous\\name'; // 保举 $class = "dangerous\\name"; // 保举
以上就是PHP 外围特点之定名空间的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!