PHP命名空间

<?php
namespace Article;
class Comment { }

namespace MessageBoard;
class Comment { }

//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();

//调用Article空间的Comment类
$article_comment = new \Article\Comment();
?>
<?php
namespace Blog\Article;
class Comment { }

namespace BBS;
class Comment { }
Class Comt { }

//导入一个类
use Blog\Article\Comment;
$article_comment = new Comment(); //与当前空间的Comment发生冲突,程序产生致命错误

//为类使用别名
use Blog\Article\Comment as Comt;
$article_comment = new Comt(); //与当前空间的Comt发生冲突,程序产生致命错误
?>

二. 选择命名空间。

 

  命名空间3个最明显的目标正是消除重名难点,PHP中不容许四个函数也许类出现相同的名字,不然会发生3个沉重的一无所长。

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
                                  // 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO

/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>
  1. 非限定名称,或不分包前缀的类名称,例如 $comment = new
    Comment();。假如当前命名空间是Blog\Article,Comment将被解析为Blog\Article\Comment。如果利用Comment的代码不分包在其它命名空间中的代码(全局空间中),则Comment会被分析为Comment。

  2. 界定名称,或带有前缀的名目,例如 $comment = new
    Article\Comment();。假若当前的命名空间是Blog,则Comment会被解析为Blog\Article\Comment。倘诺选拔Comment的代码不分包在其余命名空间中的代码(全局空间中),则Comment会被分析为Comment。

  3. 全然限定名称,或含有了全局前缀操作符的名号,例如 $comment = new
    \Article\Comment();。在那种情景下,Comment总是被分析为代码中的文字名(literal
    name)Article\Comment。
     

它们都是由此接纳use操作符来落到实处:

<html></html>
<?php
namespace Article;
?>

1. 约定三个前缀。

<?php
function getIP() { }

class FilterXSS { }
?>

骨子里能够把那三种名称类比为文件名(例如 comment.php)、相对路径名(例如
./article/comment.php)、相对路径名(例如 /blog/article/comment.php)。

//file1.php 文件代码

<?php

namespace Foo\Bar\subnamespace; 
const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>

file一.php 文件代码

公共空间 自身有2个common_inc.php脚本文件,里面有一些好用的函数和类:

【参考】PHP命名空间(Namespace)的采取详解合法文书档案菜鸟教程

<?php
namespace Blog\Article;

//引入脚本文件
include './common_inc.php';

$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog\Article\FilterXSS类

$filter_XSS = new \FilterXSS(); //正确

?>

调用公共空间的法子是直接在要素名称前加 \
就能够了,不然PHP解析器会认为笔者想调用当前空间下的因素。除了自定义的要素,还包涵PHP自带的要素,都属于集体空间。

这几天没更,是因为上壹篇翻译太长了,23333三,其实并未刹车,明天看了下啊PHP命名空间,如下:

外号和导入 小名和导入能够当作是调用命名空间成分的一种赶快方式。PHP并不帮忙导入函数或常量。

要提一下,其实公共空间的函数和常量不用加 \
也足以健康调用(不掌握PHP为什么要那样做),可是为了正确区分成分,依旧建议调用函数的时候添加
\

能够看出,名字变得十分长,那表示以往使用Comment的时候会写上更多的代码(至少字符多了)。并且,现在假诺要对一壹模块扩充更多的1部分重组职能,只怕是并行调用,发生重名的时候就需求重构名字。当然在档次始于的时候就留心到这些标题,并规定命名规则就能很好的幸免那些题材。

<?php

//创建空间Blog
namespace Blog;
class Comment { }

//非限定名称,表示当前Blog空间
//这个调用将被解析成 Blog\Comment();
$blog_comment = new Comment();

//限定名称,表示相对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new Article\Comment(); //类前面没有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Comment();
$article_comment = new \Blog\Comment(); //类前面有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\

//创建Blog的子空间Article
namespace Blog\Article;
class Comment { }

?>
<?php
namespace Blog\Article;
class Comment { }

//创建一个BBS空间(我有打算开个论坛)
namespace BBS;

//导入一个命名空间
use Blog\Article;
//导入命名空间后可使用限定名称调用元素
$article_comment = new Article\Comment();

//为命名空间使用别名
use Blog\Article as Arte;
//使用别名代替空间名
$article_comment = new Arte\Comment();

//导入一个类
use Blog\Article\Comment;
//导入类后可使用非限定名称调用元素
$article_comment = new Comment();

//为类使用别名
use Blog\Article\Comment as Comt;
//使用别名代替空间名
$article_comment = new Comt();
?>

创造1个命名空间必要动用namespace最首要字,要小心的是,当前剧本文件的首先个命名空间前边无法有别的代码正如是一无可取的:

例:项目中有七个模块:article和message
board,它们分别有二个甩卖用户留言的类Comment。之后笔者或然想要扩张对具备用户留言的部分消息计算效率,比如说笔者想博得全部留言的数量。那时候调用它们Comment提供的办法是很好的做法,可是还要引入各自的Comment类鲜明是非凡的,代码会出错,在另3个地点重写任何3个Comment也会下滑维护性。这那时只好重构类名,笔者预定了一个命名规则,在类名前边加上模块名,像那样:Article_Comment、MessageBoard_Comment

名称术语

 

 如下也是显示命名空间的引用方式:

在不一致空中之间不能直接调用其它成分,需求运用命名空间的语法:

 

在一个命名空间里引入那些本子,脚本里的元素不会归属到这么些命名空间。假如那个本子里未有定义其余命名空间,它的要素就一味高居公共空间中:


file二.php 文件代码

自己留意到,如果导入成分的时候,当前空间有雷同的名字成分将会怎么着?鲜明结果会产生致命错误。

相关文章