慕课网教程:

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. Android学习--探究服务(一)

    什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖任何的用户界面,即使应用被切换到后台或者 ...

  2. Dijkstra【p4943】密室

    Description 密室被打开了. 哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n.所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通 ...

  3. matlab的table数据类型初步接触

    由于数据分析,接触到cell的使用,字符串的使用以及ASCII的使用,但是发现在matlab中进行这样的操作相对繁琐,然后知道了table数据类型,是matlab新的数据类型,于2013版开始引入.据 ...

  4. BZOJ 1112 [POI2008]砖块Klo(可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1112 [题目大意] 给出一个数列,对于一个操作,你可以对一个数+1,或者一个数-1, ...

  5. [Contest20180318]求和

    题意:求$\sum\limits_{i=1}^n\sum\limits_{j=1}^i\sum\limits_{k=1}^i(i,j,k)$ 先令$f(n)=\sum\limits_{i=1}^n\s ...

  6. iOS 取消警告

    第一步找到要取消的警告类型 在相应的警告上右击->Reveal in Log 被选中的-Wdeprecated-declarations就是我们所要的警告类型了. -W是前缀,这个前缀表示的是 ...

  7. iOS开发经验——点击屏幕空白处退出键盘

          一种比较简单的点击屏幕空白处退出键盘的方法: 在ViewController中加入如下代码: 1: -(void)touchesBegan:(NSSet *)touches withEve ...

  8. iOS数据库的基本使用

    今天总结下数据库的基本使用方法: iOS使用的数据库一般就是sqlite3,在使用该数据库前一定要先导入数据库框架,否则会出错,接下来引入头文件#import<sqlite3.h> 在工程 ...

  9. 网络采集软件核心技术剖析系列(5)---将任意博主的全部博文下载到内存中并通过Webbrower显示(将之前的内容综合到一起)

    一 本系列随笔概览及产生的背景 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件 ...

  10. Android API level 版本对应关系

    详情地址:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version API L ...