文档章节

[初级] PHP 5.3中的命名空间:你用过了么?

be-quiet
 be-quiet
发布于 2015/02/27 10:52
字数 850
阅读 15
收藏 0

为什么我们需要命名空间?

    随着你的PHP代码库的增长,对之前定义的函数和类名进行修改时风险也更高了,当你试图增加第三方组件或插件时问题更严重,如果存在两个或两个以上的代码集实现了一个“Database”和“User”类会怎么样?

    直到目前,唯一的解决办法是使用长的类/函数名,例如Wordpress在每个类和函数名前都使用了前缀“WP_”, Zend Framework使用了极具描述性的命名约定,导致类名非常冗长,如:
    Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

    命名冲突问题可以使用命名空间来解决,PHP常量、类和函数可以被组合到命名空间库中。

如何定义命名空间?

    默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

    在PHP文件的顶部使用一个关键字namespace就可以定义命名空间,它必须是第一个命令(declare除外),在它前面不能出现非PHP代码、HTML或空格。如:
< ?php  
// define this code in the 'MyProject' namespace  
namespace MyProject;  
 
// ... code ...
     这一行下面的代码都是指定给MyProject命名空间的,为相同代码块嵌套命名空间或定义多个命名空间是不可能的,如果你真这样干,只有最后一个命名空间才能识别,但你可以在同一个文件中定义不同的命名空间代码,如:
< ?php  
namespace MyProject1;  
// PHP code for the MyProject1 namespace  
 
namespace MyProject2;  
// PHP code for the MyProject2 namespace  
 
// Alternative syntax  
namespace MyProject3 {  
 // PHP code for the MyProject3 namespace  
}  
?>
     尽管这么干是可以的,但我建议你不要这么做,最好还是每个文件中只定义一个命名空间,免得把你弄糊涂了。

子命名空间

PHP允许定义具有层次的命名空间以便库能够细分,子命名空间使用一个反斜线字符(\)分隔,如:
◆MyProject\SubName
◆MyProject\Database\MySQL
◆CompanyName\MyProject\Library\Common\Widget1

调用命名空间代码

在lib1.php文件中我们使用App\Lib1 namespace命名空间定义了一个常量、一个函数和一个类,如:
lib1.php
< ?php  
// application library 1  
namespace App\Lib1;  
 
const MYCONST = 'App\Lib1\MYCONST';  
 
function MyFunction() {  
 return __FUNCTION__;  
}  
 
class MyClass {  
 static function WhoAmI() {  
  return __METHOD__;  
 }  
}  
?>

现在我们可以在另一个PHP文件包括这段代码,如:

myapp.php
< ?php  
header('Content-type: text/plain');  
require_once('lib1.php');  
 
echo \App\Lib1\MYCONST . "\n";  
echo \App\Lib1\MyFunction() . "\n";  
echo \App\Lib1\MyClass::WhoAmI() . "\n";  
?>
    在myapp.php中并没有定义命名空间,因此这段代码存在全局空间中,任何对MYCONST、MyFunction和MyClass的直接引用都会失败,因为它们存在于App\Lib1命名空间中,为了调用lib1.php中的代码,我们可以在\App\Lib1命名空间前添加前缀定义一个完全合格的名称,下面是我载入myapp.php时的输出结果:

App\Lib1\MYCONST    
App\Lib1\MyFunction    
App\Lib1\MyClass::WhoAmI 

    完全合格名称可以变得很长,定义长名称,如App-Lib1-MyClass,有一些明显的好处。

本文转载自:http://developer.51cto.com/art/200907/137746.htm

共有 人打赏支持
be-quiet
粉丝 13
博文 9
码字总数 5133
作品 0
福州
私信 提问
基于 PHP 的 CMS 系统--PESCMS

PESCMS是一款基于 PHP 5.3 + 的CMS程序。 PESCMS是基于PHP 5.3+下的 PESPHP框架编写的程序。PESPHP框架数据库链接以PDO为核心,顾PESCMS在安全方面彻底杜绝了注入的危险!通过二次开发,还可...

金拱门
2014/03/18
2.9K
0
grep搜索utf8文件是否有bom

原网页 http://www.web-jia.com/view.php?a=5 今天在处理后台php文件导出excel出错了 以前是正常的,我本地测试也是正常的 看到报粗是eof 错误,这个php我是用的php自带的服务器所以能直接看...

hongyi1159
2017/03/31
0
0
php--------命名空间

从php 5.3 版本后,加入了命名空间的定义,在PHP中命名空间的作用就是防止类的重复。就相当于windows的一个文件夹中不能有两个相同名字的文件,所以继续增加两个文件夹把文件放进去,防止文件...

切切歆语
02/22
0
0
简单概述PHP的命名空间及其在自动载入上的应用

php自5.3以后引入了命名空间namespace这一特性使得php在面向对象设计的过程中更加规范清晰,同时在框架的架构中自动载入模式也完全尽齐用来提高框架自身的性能--按需载入 无命名空间声明其实...

big_cat
2015/10/22
843
4
nodejs网页请求data事件返回字符串

前面的文章nodejs网页请求出现情况说有时候会返回字符串的问题今天我知道怎么回事了 res.setEncoding("binary");因为有这么一行代码 当时加这行是因为下载图的时候保存不下来 网上找了说加这...

hongyi1159
2017/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

“敏捷开发”怎么就“敏捷”了

什么是敏捷开发 传统的软件开发过程中,我们往往会针对特定的用户需求,采用“瀑布模型”,从用户的需求开始一步步进行需求分析、软件设计、软件开发、软件测试以及软件交付与维护。 然而,这...

SamYjy
38分钟前
2
0
聊聊我怎么系统学习Linux技能并快速提高的

随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱好者们的喜爱。今天我们就来和大家一起聊一...

linuxprobe16
49分钟前
3
0
MySQL专题—— 从认识索引到理解索引【索引优化】

认识索引 认识索引是什么东西非常关键,一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系,为了方便查找书中的内容,通过对内容建立索引形成目录。因此,首先你要明白的一点就是,...

架构师springboot
53分钟前
2
0
Java-怎样构造方法和匿名对象

前言 在编写程序时不安全的初始化会导致程序发生发生重大错误。为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。J...

小刀爱编程
今天
2
0
7、MyBaties 增删改

事务 : 从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务. 1、在 mybatis 中默认是关闭了 JDBC 的自动提交功能 每一个 SqlSession 默认都是不自动提交事务. session.commit()提...

KingFightingAn
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部