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中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
随机推荐
- 队列 P1160 队列安排(啊啊 不会啊)
洛谷 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为 ...
- 51nod 编辑距离问题(动态规划)
编辑距离问题 给定两个字符串S和T,对于T我们允许三种操作:(1) 在任意位置添加任意字符(2) 删除存在的任意字符(3) 修改任意字符 问最少操作多少次可以把字符串T变成S? 例如: S= “AB ...
- IO 概括
# 一.概览 Java 的 I/O 大概可以分成以下几类: - 磁盘操作:File- 字节操作:InputStream 和 OutputStream- 字符操作:Reader 和 Writer- 对象 ...
- BSGS与二次剩余
BSGS $Big\ Step\ Giant\ Step$,大步小步法,一种在$O(\sqrt{p})$内求解方程$a^x\equiv b (mod\ p)$的算法. 先考虑$p$为质数的情况. 令$ ...
- AOJ 2230 How to Create a Good Game(费用流)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2230 [题目大意] 给出一张图,从1到n的最长路不变的情况下, 还能 ...
- 【可持久化Trie】bzoj3261 最大异或和
对原序列取前缀异或值,变成pre[1...N],然后询问等价于求max{a[N]^x^pre[i]}(l-1<=i<=r-1). #include<cstdio> #defin ...
- 7.3(java学习笔记)网络编程之UDP
一.UDP UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议, 传输数据时发送方和接收方无需建立连接,所以是不安全的. 发送时不建立连接直接 ...
- 微服务之SpringCloud实战(三):SpringCloud Eureka高可用
高可用Eureka 高可用我就不再过多解释了,Eureka Server的设计一开始就考虑了高可用的问题,在Eureka的服务治理设计中,所有的节点即是服务提供方也是消费方,注册中心也不例外,上一章中 ...
- 【R笔记】R语言利器之ddply
ddply()函数位于plyr包,用于对data.frame进行分组统计,与tapply有些类似 准备数据 # 使用stringsAsFactors=F来防止data.frame把向量转为factor ...
- iOS开发中几种常见的存储方式
1.archive 归档 数据的保存 1: let result = NSKeyedArchiver.archiveRootObject(contacts, toFile: path as Strin ...