本文目录一览:
PHP的命名空间使用方法,求写实例
假设程序涉及文件的输入和输出,那么就要引入system.io这样一个命名空间。
命名空间的引入主要是为了写程序时代码书写简单。
比如说filestream这个类,他就是命名空间system.io下的一个类。如果不在文件开头引入system.io这个命名空间,那么在程序中用到这个类的时候就要写成system.io.filestream,相反,如果已经引入了这个命名空间就可以直接写filestream了。
命名空间就是将一类具有相似相关功能的类和接口等打包。
只要在文件的开头写上using
system.io;
就可以直接使用这个命名空间下的类。
thinkphp命名空间有什么作用,怎么使用
在php里边,同一个应用请求里边如果存在两个方法(类名),他们的名字一样(例如都是getName()),由于php本身语法规则的限制,系统是要报错的
解决方法:
① 把他们的名字改为不一样的 例如 agetName() bgetName()
② 通过命名空间解决
Yii 框架为了避免名字重复引起问题,同步的类前边都有 C 字样
1. 简单应用
a) 命名空间是虚拟的定义空间,不是真实存在目录
b) 命名空间的分隔符都是反斜杠 \
c) 非限定名称:getName() 获得与其最近的命名空间的getName()
d) 限定名称:beijing\getName() 相对方式 通过最近的命名空间定位beijing\getName()
e) 完全限定名称: \beijing\getName() 直接在指定的命名空间获得具体元素
f) 命名空间针对:函数、类名、常量三者其作用,在命名空间里边把这三种统称为元素
2、别名和导入
a) 导入/引入 use
b) 使用一个元素,使用非限定名称,在当前最接近的空间里边获得元素
c) 如果当前空间里边没有指定元素,也可以在导入的空间里边寻找
3、公共空间
a) 第一种情况
b) 没有使用namespace定义空间,当前空间就是一个公共空间
c) 例如一个有namespace的文件引入了一个没有namespace的文件程序
d) 没有namespace的文件空间就是公共空间
e) 在namespace文件里边可以通过\斜杠直接访问公共空间元素
f) function getName(){} ------公共空间的元素
g) namespace beijing;
h) function getName(){} -----beijing空间的元素
i) 第二种情况
j) 当前文件没有namespace、但是引入的文件有namespace
k) 当前文件就是公共空间,引入文件有自己空间
PHP 为什么要使用命名空间,命名空间的作用
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。
举个栗子:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法,但是同时引入各自的Comment类显然是不行的,代码会出错,在另一个地方重写任何一个Comment也会降低维护性。那这时只能重构类名,我约定了一个命名规则,在类名前面加上模块名,像这样:Article_Comment、MessageBoard_Comment
可以看到,名字变得很长,那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且,以后如果要对各个模块增加更多的一些整合功能,或者是互相调用,发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题,并规定命名规则就能很好的避免这个问题。另一个解决方法可以考虑使用命名空间。
基础
命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。
创建一个命名空间需要使用namespace关键字,这样:
复制代码代码如下:
?php
//创建一个名为'Article'的命名空间
namespace Article;
?
要注意的是,当前脚本文件的第一个命名空间前面不能有任何代码,下面的写法都是错误的:
复制代码代码如下:
//例一
//在脚本前面写了一些逻辑代码
?php
$path = "/";
class Comment { }
namespace Article;
?
//例二
//在脚本前面输出了一些字符
html/html
?php
namespace Article;
?
为什么要说第一个命名空间呢?因为同一脚本文件中可以创建多个命名空间。
下面我创建了两个命名空间,顺便为这两个空间各自添加了一个Comment类元素:
复制代码代码如下:
?php
//创建一个名为'Article'的命名空间
namespace Article;
//此Comment属于Article空间的元素
class Comment { }
//创建一个名为'MessageBoard'的命名空间
namespace MessageBoard;
//此Comment属于MessageBoard空间的元素
class Comment { }
?
在不同空间之间不可以直接调用其它元素,需要使用命名空间的语法:
复制代码代码如下:
?php
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();
//调用Article空间的Comment类
$article_comment = new \Article\Comment();
?
可以看到,在MessageBoard空间中调用article空间里的Comment类时,使用了一种像文件路径的语法: \空间名\元素名
除了类之外,对函数和常量的用法是一样的,下面我为两个空间创建了新的元素,并在MessageBoard空间中输出了它们的值。
复制代码代码如下:
?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
$article_comment = new \Article\Comment();
?
然后我的确得到了Article空间的元素数据。
子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。
php 命名空间是什么意思
从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
具体举个例子,文件foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。