1.命名空间
namespace user1
{
class Demo1
{
const NAME = '这是user1下的Demo1';
}
}
namespace user2
{
class Demo1{
const NAME ='这是user2下的Demo1';
}
//访问另一个空间的成员,必须使用完全限定名称,根目录用'\'表示
//访问user1下的类
echo \user1\Demo1::NAME.'<br>';
//非限定名称:在访问空间成员前面没有命名空间
echo Demo1::NAME.'<br>';
//限定名称:不是从根目录找起,访问成员前至少有一个命名空间,从当前位置找起
echo user3\Demo1::NAME;
//当前空间没有该函数,会到全局空间去找
echo write();
}
namespace user2\user3
{
class Demo1
{
const NAME ='这是user3下的Demo1';
}
}
//创建一个全局的空间,匿名空间
namespace
{
function write()
{
return '我是在全局空间的函数';
}
}
2.命名空间的别名, 与类别名
namespace ns1
{
class A1
{
public static function write()
{
return 'A1的方法';
}
}
}
namespace ns2
{
class A2
{
public static function write()
{
return 'A2的方法';
}
}
}
namespace
{ //给ns1空间起别名
use ns1 as T;
//给ns2空间的A2类起别名
//use ns2\A2 as A2;
//当类名和别名一样是可以简写
use ns2\A2;
echo T\A1::write().'<br>';
echo A2::write().'<br>';
}
类文件的自动加载
__DIR__
:文件所在的目录DIRECTORY_SEPARATOR
:系统分隔符
//注册自动加载器
spl_autoload_register(function($className)
{ //将类名中的命名空间的分隔符转化为目录分隔符
$path = str_replace('\\',DIRECTORY_SEPARATOR,$className);
//生成文件名称
$file=__DIR__.DIRECTORY_SEPARATOR.$className.'.php';
//加载文件
require $file;
});
//要加载的文件的处理
//要实现自动加载要满足的条件
//1.命名空间必须与类文件所在的绝对路径一致
//2.当前类名与当前类文件名一致
//namespace inc\lib
//{
// class Demo1
// {
// public static function write()
// {
// return '这是1';
// }
// }
//}
use inc\lib\Demo1;
use inc\lib\Demo2;
echo Demo1::write().'<br>';
echo Demo2::write();
总结
基本了解了命名空间的三种访问形式完全限定名称,限定名称和非限定名称,命名空间可以避免组件加载时的命名冲突,自动加载很好的解决了需要加载多个文件就要写多个require的问题。