<?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();
?>
<?php namespace Blog/Article;
//引入脚本文件
include './common_inc.php';
$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog/Article/FilterXSS类
$filter_XSS = new /FilterXSS(); //正确
?>
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。
其实可以把这三种名称类比为文件名(例如 comment.php)、相对路径名(例如 ./article/comment.php)、绝对路径名(例如 /blog/article/comment.php),这样可能会更容易理解。