第1章 命名空间针对的主要对象
1-1 函数的命名空间
<?php
/**
* 命名空间解决了函数的全局命名冲突问题
* 如果代码使用了命名空间,那么所有代码必须写到命名空间中
*
* 同一空间不允许有两个同名的函数
*/
namespace a
{
function hello()
{
/**
* 常量__NAMESPACE__:当前空间名称
* 常量__FUNCTION__:当前函数名称
*/
return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
}
}
namespace b
{
function hello()
{
//return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
return \a\hello(); // 不同空间之间的函数调用,需要写完整的命名空间名称
}
}
// 全局命名空间名称默认为\,可以省略
namespace
{
/**
* 全局空间中调用独立的空间中的函数
* 不同空间之间的相互调用,需要使用完整空间名称
*/
//echo \a\hello();
// 调用a空间中的函数hello
echo a\hello();
echo '<hr>';
// 调用b空间中的函数hello
echo b\hello();
}
<?php
// 命名空间解决了类的全局命名冲突问题
/**
* 同意脚本不允许重复声明两个同名的类
*/
namespace a
{
class A
{
public $name = "Tom";
public function say()
{
$namespace = '命名空间:'.__NAMESPACE__;
$className = '类名:'.__CLASS__;
$methodName = '方法名:'.__METHOD__;
return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
}
}
}
namespace b
{
class A
{
public $name = "Jackson";
public function say()
{
$namespace = '命名空间:'.__NAMESPACE__;
$className = '类名:'.__CLASS__;
$methodName = '方法名:'.__METHOD__;
// 不同空间之间的数据访问必须使用完整空间名称
$temp = (new \a\A())->name; // 不同空间之间的类的访问
//return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$temp;
}
}
}
namespace // 全局空间,默认用反斜线\表示
{
echo (new a\A())->say();
echo '<hr>';
echo (new b\A())->say();
}
- 45
执行效果:
1-3 常量的命名空间
<?php
namespace a
{
/**
* const关键字声明的常量,访问时受命名空间限制
* define函数声明的常量,不受命名空间限制
*/
// 使用const声明
//const SITE_NAME = 'www.csdn.net';
// 使用define函数
define('SITE_NAME', 'www.csdn.net');
}
namespace b
{
const SITE_NAME = 'www.php.cn';
}
namespace
{
//echo a\SITE_NAME;
/**
* 使用define函数创建的常量,没有命名空间的概念,默认就是全局的
*/
echo SITE_NAME;
echo '<hr>';
echo b\SITE_NAME;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
执行效果:
第2章 命名空间的分级管理
2-1 命名空间中的普通变量
<?php
/**
* 变量本身是一个容器,命名空间对它来说没什么意义
*/
/**
* 普通变量的访问不受命名空间限制
* 常量、类、函数必须使用命名空间访问(即受命名空间限制)
*/
namespace a
{
$title = '<span style="color:red;">PHP中文网</span>';
echo '当前空间的变量:'.$title.'<hr>'; // 本空间访问
const CITY = '北京';
}
namespace b
{
//echo '访问另一个空间中的变量'.\a\$title; // syntax error, unexpected '$title' (T_VARIABLE), expecting identifier (T_STRING)
// 变量名称前不允许带空间名称
echo '访问另一个空间中的变量'.$title.'<hr>';
}
namespace
{
echo '全局空间中访问另一空间中的变量'.$title;
echo '<hr>';
// 常量、类、函数必须使用命名空间访问
echo a\CITY;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
执行效果:
2-2 命名空间的分层机制
<?php
/**
* 将命名空间进行分级管理,可以使不同空间的代码之间的逻辑关系更加的清晰
* 将有一定层级关系的命名空间的标识符之间用反斜线进行分隔 \
*
* 类空间的分级机制,是类文件自动加载的实现基础
*/
namespace father
{
const SITE_NAME = '百度';
}
namespace father\sub
{
const DOMAIN = 'www.baidu.com';
}
namespace
{
echo \father\SITE_NAME.'的域名是:'.\father\sub\DOMAIN;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
百度的域名是:www.baidu.com
- 1
第3章 命名空间的引入与简化
3-1 命名空间的导入与简化
<?php
/**
* 命名空间的导入,本质上就是用一个别名,来简化一个比较长的多级的命名空间名称
*
* 导入主要针对类空间,PHP5.6以后,也支持常量与函数空间名称导入
*
* 导入空间默认名称主要用use,空间别名的简化用as
* 使用use导入空间别名,可用as来自定义别名,防止空间重名
*/
namespace app\index\controller;
const CITY = '北京';
function say()
{
return 'Hello world!';
}
class User
{
public function hello()
{
return "I'm fine, thank you!";
}
}
namespace myspace;
// 不使用use来简化空间名称
echo \app\index\controller\CITY.'<br>';
echo \app\index\controller\say().'<br>';
$user = new \app\index\controller\User;
echo $user->hello();
echo '<hr>';
// 用use来导入一个命名空间,并起个简短的名称
use const app\index\controller\CITY;
use function app\index\controller\say;
use app\index\controller\User;
echo CITY.'<br>';
echo say().'<br>';
$user = new User;
echo $user->hello();
echo '<hr>';
// 用as来进一步简化空间的名称
use const app\index\controller\CITY as C;
use function app\index\controller\say as s;
use app\index\controller\User as U;
echo C.'<br>';
echo s().'<br>';
$user = new U;
echo $user->hello();
echo '<hr>';
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
执行效果:
3-2 全局/公共命名空间
<?php
namespace demo;
$name = 'lisi';
/**
* stdClass是系统定义在全局中的一个标准类
* 访问全局中的标准类或函数,需要在前面加反斜线\
*/
$obj = new \stdClass();
// 不同的空间下,自定义函数与系统函数可以重名
function strtoupper($str)
{
// 访问全局系统函数必须加全局空间标识\
return \strtoupper($str);
}
echo strtoupper($name); // 这里调用的是当前demo空间下的strtoupper函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
LISI
- 1
3-3 命名空间的三种引入方式
<?php
/**
* 命名空间的三种引用方式:
* 1.非限定名称
* 2.限定名称
* 3.完全限定名称
*/
namespace app\admin;
const SITE_NAME = 'PHP中文网';
function getDomain()
{
return 'www.php.cn';
}
class Demo
{
public static function hello()
{
return 'Hello world';
}
}
// 1.非限定名称:省略空间名称,使用默认或当前的命名空间
echo SITE_NAME.'<br>';
echo getDomain().'<br>';
echo Demo::hello().'<hr>';
// 2.限定名称:前面必须添加命名空间才可以访问,通常用于子空间
namespace app\admin\user;
const SITE_NAME = '百度';
function getDomain()
{
return 'www.baidu.com';
}
class Demo
{
public static function hello()
{
return 'Never say never';
}
}
namespace app\admin;
echo user\SITE_NAME.'<br>';
echo user\getDomain().'<br>';
echo user\Demo::hello().'<hr>';
// 3.完全限定名称:从全局空间的反斜线开始\
echo \app\admin\SITE_NAME.'<br>';
echo \app\admin\getDomain().'<br>';
echo \app\admin\Demo::hello().'<hr>';
echo \app\admin\user\SITE_NAME.'<br>';
echo \app\admin\user\getDomain().'<br>';
echo \app\admin\user\Demo::hello().'<hr>';
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
执行效果: