Modern-php 書摘(一)namespace

命名空間

命名空間的聲明

  • 命名空間在PHP文件的頂部,<?php 標籤後的第一行聲明;php

  • 命名空間聲明語句以namespace開頭,隨後是一個空格,而後是命名空間的名稱,最後以;結尾;函數

  • 廠商命名空間即下面聲明的「Oreilly」是最重要的命名空間;必須具備全局惟一性。spa

<?php
namespace Oreilly;

子命名空間code

<?php
namespace Oreilly\ModernPHP;

Ps: 同一個命名空間下的全部類、接口、函數不必在同一個PHP文件中聲明;
因此,咱們能夠在不一樣的文件中編寫屬於同一個命名空間的多個類。接口

import and alias

PHP引入namespace以前,開發者們使用Zend式的類名來解決命名衝突問題;作用域

# Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query => Zend/Cloud/DocumentService/Adapter/WindowsAzure/Query.php

可是你也看到了,太TM長了,不能忍啊!!!
namespace提供了 import和 alias來解決這個問題。
import,alias 在5.3版本下支持類,接口與命名空間導入。5.6開始支持函數與常量導入。開發

# namespace without alias
<?php
$response = new \Symfony\Component\HttpFoundation\Response('Oops',400);
$response->send();
$response2 = new \Symfony\Component\HttpFoundation\Response('Success',200);
# namespace with Default alias 
use Symfony\Component\HttpFoundation\Response;
$response = new Response('Oops',400);
$response->send();
# namespace with custom alias 
use Symfony\Component\HttpFoundation\Response as Res;
$response = new Res('Oops',400);
$response->send();

注意:it

  • 同namespace聲明同樣,在PHP文件頂部使用use關鍵字,並且在<?php 標籤或者聲明命名空間以後;io

  • 開頭無需加\符號,由於PHP導入是徹底限定;編譯

  • use必須出如今全局做用域中,由於use在編譯時使用。

PHP5.6之後能夠導入函數和常量;

<?php
use func Namespace\functionName;

functionName();

導入常量:

<?php
use constant Namespace\CONST_NAME;

echo CONST_NAME;

實用技巧

多重導入

若是想在一個PHP文件中導入多個類、接口、函數或者常量,須要使用多個use語句;

不建議:

<?php
use Symfony\Component\HttpFoundation\Request,
    Symfony\Component\HttpFoundation\Response,
    Symfony\Component\HttpFoundation\Cookie;

建議:

<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;

PHP容許一個文件定義多個命名空間【強烈不建議】

<?php
namespace Foo {
    //...
}

namespace Bar {
    //...
}

全局命名空間

<?php
namespace My\App;

class Foo
{
    public function doSomething()
    {
        $ex = new \Exception();
    }
}

NOTE: 此時,在 Exception類的名稱前加\前綴是告訴PHP在全局中查找Exception,默認會在當前命名空間中查找;

相關文章
相關標籤/搜索