PHP 命名空间namespace 和 use
慕课网教程:
http://www.imooc.com/video/7834
PHP 中命名空间的概念和高级语言(如C#、JAVA)有很大的差异,一度让我混淆甚至怀疑它存在的意义和目的。
今天找时间学习了一下才明白它的作用:防止类名(class)重复
我们从一个简单的demo来学习一下命名空间;
先分别新建两个简单的类文件,并且故意让类名重复;
a.php
# a.php
<?php
class Apple {
public function get_info(){
echo "a";
}
}
b.php
#b.php
<?php
class Apple {
public function get_info(){
echo "b";
}
}
再新建一个测试页面index.php,分别引用两个类文件
<?php require_once 'a.php';
require_once 'b.php'; $a = new Apple;
$a->get_info();
打开页面后你会看到报错咯:

原因很明显就是类名冲突了,那改一下类名不就得了?是的,但某些场景下,我们可能避免不了发生这样的冲突。
PHP给我们提供的解决方案就是命名空间(namespace)
PHP中的命令空间作用,有点像将类放入不同的文件夹中(如a\b\c 或者 d\e\f)管理,这样一来,不同命名空间下的类就不会互相影响了。因为编译器会认为他们不是同一个类。写法如下:
<?php
namespace a\b\c; class Apple {
public function get_info(){
echo "a";
}
}
再次打开index.php页面发现错误消失了,并且输出了b。说明了使用了b的Apple类
如果我想使用a的Apple类应该如何做呢?在index.php中使用 use 关键字,指定我们要使用a\b\c命名空间下的Apple类,代码如下:
<?php
# 让编译器知道下列的new Apple都是使用a\b\c命名空间下的类
use a\b\c\Apple; require_once 'a.php';
require_once 'b.php'; $a = new Apple; // 等同于 $a = new a\b\c\Apple $a->get_info();
打开index.php,页面成功输出了a
再来探讨另一种情况,如果b的Apple类也存在于命名空间下:
<?php
namespace d\e\f;
class Apple {
public function get_info(){
echo "b";
}
}
那么我在index.php中就算使用 use d\e\f\Apple 很显然会替换掉了use a\b\c\Apple;这个时候可以使用 AS 关键字 用来设置别名
代码如下:
<?php use a\b\c\Apple;
use d\e\f\Apple as bApple; require_once 'a.php';
require_once 'b.php'; $a = new Apple;
$a->get_info(); $b = new bApple();
$b->get_info();
打开页面就可以看到成功输出了b,并且这个时候使用a的Apple类也不会影响输出a
再来看最后一种情况,如果现在添加一个类文件c.php
<?php
class Apple {
public function get_info(){
echo "c";
}
}
c的Apple类没有放置在任何的命名空间下,那么在Index.php中又应该如何使用而不和a、c冲突呢,很简单,在Apple类前加一个\即可作为最高权限。代码如下:
<?php
use a\b\c\Apple;
use d\e\f\Apple as bApple; require_once 'a.php';
require_once 'b.php';
require_once 'c.php'; $a = new Apple;
$a->get_info(); $b = new bApple();
$b->get_info(); $c = new \Apple();
$c->get_info();
打开页面即可正常输出abc了。所以,当我们看到一个类名前加上一个\,说明该类不存在于任何命名空间之中。
以上
PHP 命名空间namespace 和 use的更多相关文章
- PHP 命名空间(namespace)
PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...
- Atitit 深入理解命名空间namespace java c# php js
Atitit 深入理解命名空间namespace java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3 ...
- PHP 使用命名空间(namespace),实现自动加载
示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...
- PHP命名空间(Namespace)的使用详解(转)
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- PHP命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- include与__autoload与命名空间namespace与PSR4详解
1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...
- PHP深入浅出之命名空间(Namespace)的使用详解
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- 第十一节,命名空间namespace
1,命名空间的定义 命名空间可以把不同的方法分散到不同的文件去实现,如果你会objective-C,他的作用和里面的类目有异曲同工之妙.当然了也有很多不同的地方,首先要明白的是,命名空间并不是一个类, ...
- C++笔记008:C++对C的扩展——命名空间 namespace基础
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 第一, 命名空间的意义 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 我认识两位叫“A”的朋友,一 ...
- PHP的命名空间namespace
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
随机推荐
- golang笔记:unsupported driver -> Scan pair: <nil> -> *string
golang里,操作mysql数据库,使用查询语句的时候,一般的写法 rows, err := db.Query("select name from table") if err ...
- 循环节(BFS)
循环节 时间限制: 1 Sec 内存限制: 64 MB提交: 56 解决: 16[提交][状态][讨论版] 题目描述 第一节是英语课.今天,老师又教了桐桐很多单词.桐桐发现所有单词都有循环节(大写 ...
- 【树上莫队】【带修莫队】bzoj3052 [wc2013]糖果公园
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- 【单调队列】bzoj1047 [HAOI2007]理想的正方形
先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...
- MySQL json 类型操作快速入门
MySQL 5.7.8开始支持 json类型. create table t(id int,js json,PRIMARY KEY (`id`)) 插入数据insert into t values(1 ...
- kill -3 获取threaddump信息
有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,会将其标准输出重 定向到一个文件,用"nohup ./star ...
- MJExtension使用指导(转)
MJExtension使用指导(转) MJExtension能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) --& ...
- JAVA Socket 连接时长
其实关于这个问题可能用到的人不会很多,不过我在这里还是说说. 正常很多人写socket通信时,都会直接通过new socket(IP,PORT)直接去链接服务器.其实这种做法也没有错误,但是若当服务器 ...
- Java二进制指令代码解析
http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...
- delphi设计浮动窗口
delphi设计浮动窗口 用过Photoshop的朋友一定对它的那些方便的浮动面板记忆犹新,其实这些面板就是一个个的小窗体,但这些小窗体都放在Photoshop的主窗体上 (不是存在主窗体中),有自己 ...