慕课网教程:

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的更多相关文章

  1. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  2. Atitit  深入理解命名空间namespace  java c# php js

    Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3 ...

  3. PHP 使用命名空间(namespace),实现自动加载

    示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...

  4. PHP命名空间(Namespace)的使用详解(转)

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  5. PHP命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  6. include与__autoload与命名空间namespace与PSR4详解

    1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...

  7. PHP深入浅出之命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  8. 第十一节,命名空间namespace

    1,命名空间的定义 命名空间可以把不同的方法分散到不同的文件去实现,如果你会objective-C,他的作用和里面的类目有异曲同工之妙.当然了也有很多不同的地方,首先要明白的是,命名空间并不是一个类, ...

  9. C++笔记008:C++对C的扩展——命名空间 namespace基础

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 第一, 命名空间的意义 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 我认识两位叫“A”的朋友,一 ...

  10. PHP的命名空间namespace

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

随机推荐

  1. CodeForces 669B

    链接:http://codeforces.com/problemset/problem/669/B 本文链接:http://www.cnblogs.com/Ash-ly/p/5443086.html ...

  2. 最小割分治(最小割树):BZOJ2229 && BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...

  3. 【DFS】URAL - 2104 - Game with a Strip

    大概就是dfs?当前区间(l,r)的答案可以由(l,m)和(m+1,r)区间推出,如果某个区间已经完全被某种颜色覆盖,那么就返回该颜色.否则按照递归层数判定,奇数层Alice占优势,只需左右区间中一者 ...

  4. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  5. windows下虚拟环境安装方法

    方法一:使用virtualenv安装虚拟环境 1.安装virtualenv pip install virtualenv 2.随意创建文件夹(将来虚拟环境会在这个文件夹)    mkdir mypro ...

  6. 1.6(学习笔记)EL表达式

    1.表达式输出属性 先来看一个简单的表达式小例子 el.jsp <%@ page language="java" contentType="text/html; c ...

  7. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...

  8. HTML5本地缓存localStorage和sessionStorage的操作方法收集

    说明: Web Storage 包含如下两种机制: sessionStorage 为每一个给定的源(given origin)维持一个独立的存储区域,该存储区域在页面会话期间可用(即只要浏览器处于打开 ...

  9. 学习使用常用的windbg命令(u、dt、ln、x)

    http://blog.csdn.net/wesley2005/article/details/51501514 目录: (1) u命令(反汇编) (2) dt命令(查看数据结构) (3) ln命令( ...

  10. winform如何保持TreeView节点展开和折叠的状态

    转载:http://blog.sina.com.cn/s/blog_6abcacf5010138q5.html private Hashtable NodesStatus = new Hashtabl ...