关闭

PHP中命名空间

标签: php函数classthinkphp
1111人阅读 评论(0) 收藏 举报
分类:

命名空间的意义:

命名空间最主要的目的就是解决函数或者类重名的问题,一般的来说如果函数或者类名冲突的话,比如一个common函数  分别是home和admin下面的  如果都定义为common就会重名 一般的来说会会重构函数名,认为的这样定义:home_common和admin_common来解决重名的问题;
这样明显函数名的字符变多了,如果在项目开始的时候就注意到这个问题就可以免函数或者类重名咯,还有一个办法就是使用命名空间。、

注:在php5.3之后const也可以用在类的外部使用,在命名空间中const是针对当前空间的,define是针对全部的,一下提到的都是const;

命名空间的概念:

命名空间是把代码中不同的函数,类划分到一个空间中,空间与空间之间没有影响,这个就类似于“封装”的概念;

创建一个命名空间:

创建一个命名空间需要使用namespace关键字
例如下面的:
<?php
namespace China;  //创建一个名为China的命名空间
//注意在当前脚本文件的第一个命名空间的前面是不能有任何代码的
function Common(){return 1000;} //在当前的命名空间下面定义了一个名为common的函数

一个脚本文件可以创建多个命名空间,就只要求第一个前面不能有任何逻辑代码
<?php
 

//创建一个名为'Article'的命名空间
namespace Article;

//此Comment属于Article空间的元素
class Comment { }


//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;

//此Comment属于MessageBoard空间的元素
class Comment { }
?>

在不同的命名空间之间不能调用其他命名空间内的元素,如果调用要用命名空间的语法,
<?php
namespace China;  //创建一个名为China的命名空间
//注意在当前脚本文件的第一个命名空间的前面是不能有任何代码的
class Common{}; //在当前的命名空间下面定义了一个名为common的类
namespace meiguo;
class Common{};

$com = new Common();  //在meiguo的命名空间下
$comm =new  \China\Common();  //在China下面的common   使用语法是\空间名\元素名

除了类之外对函数和对常量的用法也是一致的

<?php
namespace China;  //创建一个名为China的命名空间
//注意在当前脚本文件的第一个命名空间的前面是不能有任何代码的
const PATH = '/China';
function Getinfo(){return 1000;}
class Common{}; //在当前的命名空间下面定义了一个名为common的类
namespace meiguo;
const PATH = '/meiguo';
function Getinfo(){return 300;}
class Common{};

//调用当前空间的常量 函数 类
echo PATH;
echo Getinfo();
$com = new Common(); 

//调用China下面的常量 函数 类
echo \China\PATH;
echo \China\Getinfo();
$comm =new  \China\Common();  

子空间:

命名空间的语法和文件路径的语法是一样的,它允许我们自定义子空间来描述各个空间之间的关系
比如说home 和admin都是在shop项目的下面的
<?php
namespace shop\China;  //创建一个名为China的命名空间
//注意在当前脚本文件的第一个命名空间的前面是不能有任何代码的
const PATH = '/China';
function Getinfo(){return 1000;}
class Common{}; //在当前的命名空间下面定义了一个名为common的类

namespace shop\meiguo;
const PATH = '/meiguo';
function Getinfo(){return 300;}
class Common{};

//调用当前空间的常量 函数 类
echo PATH;
echo Getinfo();
$com = new Common(); 

//调用China下面的常量 函数 类
echo \shop\China\PATH;
echo \shop\China\Getinfo();
$comm =new  \shop\China\Common();  



公共空间:

在命名空间引入一个脚本,这个脚本是不属于这个命名空间的,
<?php
namespace shop\China;  //创建一个名为China的命名空间
//注意在当前脚本文件的第一个命名空间的前面是不能有任何代码的
require("./login.php");

echo Getinfo();
//$fun = new common();  //这样不行  会出现致命错误
$fun = new \common();  //调用公共空间的时候  就直接在前面加上  /就可以咯  否则PHP解析器会认为我们想要调用当前空间下的元素


注:可能加上\的目的就是为了区分是不是调用外部的函数(个人推论)

命名空间的专业术语:

在识别名和导入之前要知道 三种命名空间的术语,以及PHP解释器怎么解释他们的
1.非限定名称,或不包含前缀的类名称,例如 $comment = new Comment();。如果当前命名空间是shop\China,Comment将被解析为shop\China\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

2.限定名称,或包含前缀的名称,例如 $comment = new China\Comment();。如果当前的命名空间是Blog,则Comment会被解析为shop\China\Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new \homeComment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)home\Comment。

下面是应用的几个例子:

<?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不支持导入函数或者常量
<?php
 

namespace Blog\Article;

class Comment { }


//创建一个A空间
namespace A;

//导入一个命名空间
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();

?>

导入元素的时候,如果当前空间有相同名称的元素,则会产生致命错误

<?php
namespace Blog\Article;

class Comment { }


namespace A;

class Comment { }

Class Comt { }


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

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

use Blog\Article\Comment as Comtt;
$article_comment = new Comtt(); //这样名称不一样就不会报错了

动态调用:

namespace Blog\Article;

const PATH = '/Blog/article';

class Comment { }


//namespace关键字表示当前空间
echo namespace\PATH; ///Blog/article
$comment = new namespace\Comment();

//魔法常量__NAMESPACE__的值是当前空间名称
echo __NAMESPACE__; //Blog\Article
//可以组合成字符串并调用
$comment_class_name = __NAMESPACE__ . '\Comment';
$comment = new $comment_class_name();

字符串形式调用问题:






1
0
查看评论

php命名空间与引入

1.命名空间what&why 在php程序语言里边,语法规则要求同名称的函数、类名、常量在一个请求里边不允许出现多次。如果有的应用程序(例如tp框架中有smarty、视频方法插件,他们有同名称的多个元素)不得已必须出现多个同名的 函数、类名、常量,那么我们就可以把它们放到不同的空间里边做请...
  • MrZZhou
  • MrZZhou
  • 2016-10-28 13:20
  • 766

PHP中的命名空间(namespace)及其使用详解

php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入);那么什么是命名空间呢?php官网已很明确的进行了定义并形象化解释,这里直接从php官网copy一段文字[来源]。 “什么是命名空间?从广义上来说...
  • dahuzix
  • dahuzix
  • 2015-06-28 15:12
  • 9422

PHP中的命名空间

PHP中的命名空间 原发表于:https://www.zybuluo.com/phper/note/65479 php是世界上最伟大的语言!霸气开场(^__^) 1. 什么是命名空间? 命名空间对应的英文是namespace,所以翻译成中文叫命名空间,在很多的语言中,都有这个names...
  • yangyi2083334
  • yangyi2083334
  • 2015-01-25 15:38
  • 1392

关于PHP中命名空间和spl_autoload_register函数的关系说明

在我们使用命名空间的时候,只完成了一种逻辑关系的独立。意思也就是说,对于PHP引擎来说,当他看到 namespace myclass;的时候,可以知道,此名称以下定义的类库拥有了一个独立的空间,名字叫做 myclass 。而同样的类库名称不能在同一个明明空间中,意思类似于,同一个文件夹下,不能创建相...
  • yuexiage1
  • yuexiage1
  • 2017-09-05 14:26
  • 393

PHP5.6对命名空间的扩展,use可以导入函数与常量空间

php版本 > 5.60 1、解决命名冲突 2、导入类、函数、常量 3、赋予别名 test1.php namespace Demo1; class test1 { private $name = 'bigboy'; pub...
  • Baymax001
  • Baymax001
  • 2017-06-06 19:56
  • 570

如何理解php中命名空间概念

PHP中命名空间的本质是容器,可以起到封装的作用。 在这个容器中中我们可以放入变量,函数,类。 php命名空间概念的理解可以类比于文件目录,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。 上面root文件夹下包含两个子文件夹sub1和sub2,sub1和...
  • qlzx_syzx
  • qlzx_syzx
  • 2015-07-31 22:49
  • 1285

PHP基础篇--利用命名空间解决类名问题

//util.php <?php namespace com\instance\util; class Debug{ static function sayHello(){ print("Hello,".__NAMESPACE__."\n"...
  • albusbing99
  • albusbing99
  • 2014-12-08 20:10
  • 551

PHP类的自动加载与命名空间及use的理解

今天写一个demo,遇到一个问题,平时框架用多了,下意识的就以为use就能引入类,导致一直跑不成功,后来才意识到use与引用类并不是一回事。use只是指定了要使用哪个命名空间下的类,但是并不会引入类,类的引用还是需要使用include或require。这里记录一下这次事件的总结,加深一下印象。类的引...
  • u012720371
  • u012720371
  • 2017-07-03 23:58
  • 615

php命名空间的设计思想和缺点

相比C#等语言,你可以在php函数里面随意定义变量并赋值,而不用担心覆盖了全局变量,或者类变量;你也可以随意的定义类变量,而不用担心会和函数名冲突,因为变量前面都有个$。php的命名空间和全局变量、局部变量的设计思想一样,都是为了尽可能的减少命名冲突。php的命名空间可以和文件系统类似,有相对命名空...
  • llj1985
  • llj1985
  • 2016-04-19 12:27
  • 1416

PHP手册-__NAMESPACE__关键字(命名空间中继承其他命名空间中类注意)

常量__ NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。 When extending a class from another namespace that should instantiate a class from w...
  • dizzthxl
  • dizzthxl
  • 2012-08-05 16:53
  • 4884
    个人资料
    • 访问:326013次
    • 积分:5182
    • 等级:
    • 排名:第6325名
    • 原创:218篇
    • 转载:12篇
    • 译文:1篇
    • 评论:29条
    最新评论