PHP 核心特性之命名空间-php教程

资源魔 37 0
提出

正在定名空间提出以前,没有同的组件很容易碰着定名的抵触,例如 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开发自学

抱歉,评论功能暂时关闭!