使用命名空间,避免引入第三类库时的类或函数命名冲突
命名空间与类的文件路径一致,就可以实现类的自动加载
1.命名空间
- 使用
namespace
关键字为当前代码段创建命名空间 - 每个空间都是独立的,不同命名空间就算在同一文件中也可以创建同名方法和类
1.1 命名空间中元素的访问
- 1.非限定名称,不包含路径访问当前命名空间中的元素,
- 2.限定名称,当要访问的元素在当前空间的下级空间时可以省略当前空间名,似相对路径
- 3.完全限定名称,访问另一空间中的元素时,需要从根空间开始访问
homework.php
<?php
//命名空间
//访问命名空间中元素的几种方式
namespace phpstudy\second;
function getFileName(){
return __NAMESPACE__;
}
namespace phpstudy\first\first;
function getFileName(){
return __NAMESPACE__;
}
namespace phpstudy\first;
class Demo{
protected const FILE_NAME = 'homework.php';
public static function getFileName(){
return self::FILE_NAME;
}
}
//1.非限定名称,不包含路径访问当前命名空间中的元素,
echo demo::getFileName(),'<br>';//homework.php
//2.限定名称,当要访问的元素在当前空间的下级空间时可以省略当前空间名,似相对路径
echo first\getFileName();//phpstudy\first\first
//3.完全限定名称,访问另一空间中的元素时,需要重根空间开始访问
echo \phpstudy\second\getFileName();//phpstudy\second
1.2 命名空间和类的别名
- 可以为命名空间和类起别名,省去重复写命名空间路径和避免类名重复
homework.php 续
include 'test1.php';
amespace phpstudy\fourth;
class Demo{
}
//声明命名空间别名
use phpstudy\first as first;
//使用命名空间别名访问
echo first\Demo::getFileName();//homework.php
//存在类名重复时可以为引用的命名空间中类起别名,
use phpstudy\first\Demo as Test;
//使用类别名访问,不需要路径
echo Test::getFileName();//homework.php
2. 自动加载
spl_autoload_register
方法,当new一个不存在的类时自动调用注册的函数- 使文件名与类名一致,再使用该方法加上
require
或include
包含文件,就可以实现自动加载类文件了
示例:
<?php
//注册到自动装载函数队列中
try{
spl_autoload_register(function($calssname){
$calssname = str_replace('\\',DIRECTORY_SEPARATOR,$calssname);
$file = __DIR__.DIRECTORY_SEPARATOR.$calssname.'.php';
require($file);
},true);
}catch(\Exception $e){
die($e->getMessage());
}
//同级目录下创建有 Test.php文件,文件中有个Test类
use \Test;
//调用Test类时自动加载了Test文件
echo Test::index();//输出:当前方法:Test::index
Test.php
<?php
namespace {
class Test
{
public static function index()
{
return '当前方法:'.__METHOD__;
}
}
}