1.命名空间实例演示
代码如下:
<?php
/**
* 命名空间:解决全局成员的命名冲突
*/
// 一个脚本中,可以创建多个空间
namespace ns1 {
// 空间成员
// 常量
const APP = '商城mall';
}
// 空间分级管理:子空间
namespace ns2\ns3 {
const APP = '问答';
echo APP.'<br>';
}
namespace ns2 {
// 空间成员
// 常量
const APP = '社区';
// 2. 非限定名称:总是从当前空间开始查询
echo APP .'<br>';
echo \ns1\APP .'<br>';
// 在ns2中访问ns1的APP
// 一定要通过全局/根空间开始查询
// 根空间:\
// 1. 完全限定名称:从根空间开始查询
echo \ns1\APP .'<br>';
// 在ns2空间,访问子空间,ns2\ns3中的成员
// 3. 限定名称: ns3\APP
echo '<span style="color=red">' . ns3\APP .'</span><br>';
}
/**
* 命名空间类型
* 1. 完全限定名称: 根空间开始 '\a\b\APP' "绝对路径"
* 2. 非限定名称: 从当前空间开始, 'APP' "当前路径"
* 3. 限定名称: 子空间, 'ns\APP' "相对路径"
*/
// 全局空间:匿名的,不要写空间名,用"\"来引用
namespace {
function hello()
{
echo 'hello 大家好';
}
echo '<span style = "color:red">' .ns1\APP. '</span><br>';
echo '<span style = "color:blue">' .ns2\ns3\APP. '</span><br>';
}
效果如下:
2.类自动加载器实例
代码如下:
/**
* 命名空间
* 1. 一个文件中, 只允许声明一个命名空间并只写一个类
* 2. 命名空间的命名,应该与成员的路径一致
* 3. 类名,必须与类文件名对应
*/
namespace ns1;
require __DIR__ . '/autoloader.php';
class Demo2
{
}
// new \php\cn\Demo2;
echo Demo2::class . '<br>';
echo \php\cn\Demo2::class;
注册类自动加载器
// 注册一个类的自动加载器
spl_autoload_register(function ($class) {
// echo $class;
// 1. 将命名空间=>映射到一个类文件的绝对路径
$path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
// 2. 生成类文件路径
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
// 3. 加载这个类文件
require $file;
});
效果如下: