慕课网教程:

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. 组合数学+错排问题【p4071】[SDOI2016]排列计数

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  2. 【动态规划】矩形嵌套 (DGA上的动态规划)

    [动态规划]矩形嵌套 时间限制: 1 Sec  内存限制: 128 MB提交: 23  解决: 9[提交][状态][讨论版] 题目描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a, ...

  3. OC语言基础之NSString

    1.字符串的创建 1: NSString *s1 = @"jack"; 2: 3: //NSString *s2 = [[NSString alloc] initWithStrin ...

  4. 使用apt-cache search搜索想要的软件包

    环境: Ubuntu14.10 我在编译u-boot代码的时候遇到了如下问题: LD test/dm/built-in.o CC examples/standalone/stubs.o LD exam ...

  5. oracle 11g jdbc jar包在哪个文件目录

    一. 如果装了oracle数据库的话, 大致是这样的目录:    D:\oracle\product\11.2.0\client_1\oui\jlib\classes12.jar 或者    D:\o ...

  6. RUEI 13.1.1版本在OEL 5.7上的安装

    准备工作 ntp的工作和同步 /sbin/chkconfig --list | grep ntpd ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off /sb ...

  7. 初识JdbcTemplate

    1.spring配置文件里注冊:參照使用 Spring jdbcTemplate 进一步简化 JDBC 操作 2.写javabean 3.写rowmapper(依据javabean来封装结果集) 4. ...

  8. meta文件里指定资源

    unity的黑科技 https://github.com/keijiro/KinoFringe/tree/master/Assets/Kino 这个包里面 shader的绑定很有意思在meta里面 d ...

  9. maven的安装和eclipse的配置以及构建mahout基本项目

    maven介绍在此略过 下载地址: 点击打开链接 windows下载xxx-bin.zip文件 linux下载xxx-bin.tar.gz 这里以windows为例 下载完成直接解压到一个目录下 计算 ...

  10. 1-N中1出现的次数

    /*标记1-N中1出现的次数.例如,当N等于18时,1出现的次数为2 + 9 = 11 个位数出现1的为:1,11,十位数出现1的为10-18*/public class OneNoInN { // ...