PHP中的命名空间
2015-09-01 13:50
706 查看
概述
命名空间的作用是解决命名冲突定义命名空间
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前
同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。
定义子命名空间
namespace MyProject\Sub\Level;
MyProject\Sub\Level与实际目录没有关系
是
\而不是
/
在同一个文件中定义多个命名空间
<?php namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } namespace AnotherProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>
在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。
使用命名空间
举个栗子
在同一目录下有如下文件a.php b.php c.php 001.php
a.php
<?php namespace x\y\z; class People { public $name = 'this is people a'; }
b.php
<?php namespace l\m\n; class People { public $name = 'this is people b'; }
c.php
<?php class People { public $name = 'this is people c'; }
001.php
<?php require 'a.php'; require 'b.php'; require 'c.php'; $a = new x\y\z\People; // \x\y\z\People $b = new l\m\n\People; // \l\m\n\People $c = new People; // \People echo $a->name . '<br>'; // this is people a echo $b->name . '<br>'; // this is people b echo $c->name; // this is people c
如果给001.php加上命名空间会报错
<?php namespace o\k; require 'a.php'; require 'b.php'; require 'c.php'; $a = new x\y\z\People; // \o\k\x\y\z\People $b = new l\m\n\People; // \o\k\l\m\n\People $c = new People; // \o\k\People
此时必须使用完全限定名称
<?php namespace o\k; require 'a.php'; require 'b.php'; require 'c.php'; $a = new \x\y\z\People; // \x\y\z\People $b = new \l\m\n\People; // \l\m\n\People $c = new \People; // \People echo $a->name . '<br>'; // this is people a echo $b->name . '<br>'; // this is people b echo $c->name; // this is people c
全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称
别名/导入
为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。别名是通过操作符 use 来实现的
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use ArrayObject; // importing a function (PHP 5.6+) use function My\Full\functionName; // aliasing a function (PHP 5.6+) use function My\Full\functionName as func; // importing a constant (PHP 5.6+) use const My\Full\CONSTANT; ?>
一行中包含多个use语句
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func ?>
相关文章推荐
- php学习--1
- php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
- PHP 数组转字符串后仍保留数组格式
- PHP入门常见问题
- PHP中的函数
- 怎么去掉discuz!的portal.php后缀
- Ajax不能接受php return值原因分析
- Metinfo /admin/include/common.inc.php SQL Injection Vul
- Dummy output - No Sound Card Detected(转)
- PHP-php-fpm占用系统资源分析
- Laravel框架学习-1.初探路由
- PHP 中使用 PDO
- PHP 中使用 PDO
- PHP中的流程控制
- php在mysql中随机插入数据
- php第一阶段html_table(2)
- js,php 使用正则表达式解析GPS数据
- 解决ftp客户端 建立数据socket 失败问题
- PHP 第一阶段 html(1)
- Yii rules常用规则