PHP命名空间的使用规则

原创
2014/12/21 12:56
阅读数 170
  1. namespace必须在文件的最开始部分,其次是use语句

  2. php的namespace和C++,C#的一样,旨在限定某一作用集合,不具备java的自动导入能力

  3. 在同一个命名空间中,无须使用use

   4.命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。

 5.不同文件中可以使用同样的命名空间


实例:

统一文件中可以使用多个命名空间,但要注意的是,这种方式极其不规范,这里仅作演示使用.

<?php//创建一个名为'Article'的命名空间
namespace Article;
//此Comment属于Article空间的元素
class Comment { }

//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;
//此Comment属于MessageBoard空间的元素
class Comment { }
?>

使用方式:

<?php
namespace Article;
const PATH = '/article';
function getCommentTotal() {
    return 100;
}
class Comment { }

namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
    return 300;
}
class Comment { }
//调用当前空间的常量、函数和类
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();
//调用Article空间的常量、函数和类
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100   注意,这里以 "\"开始,来防止MessageBoard被认为是Article的子空间
$article_comment = new \Article\Comment();
?>

命名空间可以使用子空间

<?php//我用这样的命名空间表示处于blog下的article模块
namespace Blog\Article;
class Comment { }

//我用这样的命名空间表示处于blog下的message board模块
namespace Blog\MessageBoard;
class Comment { }
//调用当前空间的类
$comment = new Comment();
//调用Blog\Article空间的类
$article_comment = new \Blog\Article\Comment();
?>

----------------------------------------------------------------------------------------------

文件引入和命名空间问题:文件的引入和命名空间是2个不同放入概念,这是和java等最大的区别

1.include,require引入的文件路径不一定和命名空间要相关才行,统一目录下也可以使用

2.对于面向对象的开发,命名空间+自定义的__autoload函数进行文件的引入,这种方式命名空间和路径必须完全相同

3.对于类文件,使用use时,最好用as转换,如 命名空间为\App\Member\Model的User类,可以转为 use \App\Member\Model\User as User;这样我们引入User.class.php之后,可以缩短对象的创建方式。

4.如上,可能在同一命名空间下有很多类,这个问题我们可以使用

use \App\Member\Model\User as Member

var user = new member\User();

5.当引入文件的命名空间的根namespace和当前文件的命名空间相同,可以不加 "\",如 user Member\Model

---------------------------------------------------------------------------------------------

有时,有些库文件不需要命名空间,那么默认的命名空间是 "\"

我有一个common_inc.php脚本文件,里面有一些好用的函数和类:

代码如下:

<?php
function getIP() { }
class FilterXSS { }
?>

在一个命名空间里引入这个脚本,脚本里的元素不会归属到这个命名空间。如果这个脚本里没有定义其它命名空间,它的元素就始终处于公共空间中:

<?phpnamespace Blog\Article;
//引入脚本文件
include './common_inc.php';
$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog\Article\FilterXSS类
$filter_XSS = new \FilterXSS(); //正确
?>

使用use

<?phpnamespace 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();
?>


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部