1.完全限定,限定,非限定,三种类名称
<?php
// 完全限定名称的类名,限定名称的类名,非限定名称的类名
// 命名空间的别名
namespace ns1;
class T1 {}
namespace ns2;
class T1 {}
namespace ns3;
// 访问ns1里的T1
// 从当前空间开始访问另一个空间,应该从全局开始
// ns1\T1:完全限定名称的类名,类似绝对路径,从根开始
echo \ns1\T1::class;
echo '<hr>';
// 访问ns3\sub::Hello,完全限定名称的类名
echo \ns3\sub\Hello::class;
echo '<hr>';
// 可以省略当前类名相同的部分ns3, \ns3\去掉也是一样的结果,这叫限定名称的类名,类似相对路径
echo sub\Hello::class;
echo '<hr>';
// 访问当前空间类成员,不用加类名称ns3,不需要 echo ns3\Work::class;
// 非限定名称的类
class Work {}
echo Work::class;
echo '<hr>';
// 访问ns2里的T1,用完全限定访问
echo \ns2\T1::class;
echo '<hr>';
// 简化:访问ns2里的T1。先给空间起个别名,关键字use
use \ns2 as S;
echo '别名访问:' . S\T1::class;
// use后的关键字必须是完全限定名称的空间或类
echo '<hr>';
// 给完全限定名称的类起个别名,
use \ns2\T1 as Test;
echo '别名访问:' . Test::class;
echo '<hr>';
// 如果别名和类名相同
// use \ns2\T1 as T1;
// 上面的T1类名一样了,用下面方法一样,可以省略as后面的别名
use \ns2\T1;
echo '别名访问:' . T1::class;
echo '<hr>';
// 哪种情况下不能省略别名呢? 别名相同时,就不能省略
use \ns2\T1 as TT;
echo '别名访问:' . TT::class;
namespace ns3\sub;
class Hello {}
2.类的自动加载
- 准备:建两个文件目录:inc,lib,包含关系,在lib目录下建3个文件:Test1,Test2,Test3
<?php
// 当前类的命名空间与当前类的文件路径对应
namespace inc\lib;
// 类名与当前类文件名称相同
class Test1{}
<?php
namespace inc\lib;
class Test2{}
<?php
namespace inc\lib;
class Test3{}
<?php
// 类的自动加载
spl_autoload_register(function($class){
// 文件路径
$path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
// 文件名
$file = __DIR__ .DIRECTORY_SEPARATOR .$path. '.php';
require $file;
});
echo inc\lib\Test1::class;
echo '<hr>';
try {
spl_autoload_register(function($class){
// 文件路径
$path = str_replace('\\', DIRECTORY_SEPARATOR, $class);
// 文件名
$file = __DIR__ .DIRECTORY_SEPARATOR .$path. '.php';
// 加载异常测试,判断它是个文件,文件必须存在
if (!(is_file($file) && file_exists($file)))
throw new \Exception('不是文件或文件不存在');
require $file;
});
} catch (Exception $e) {
die($e->getMessage());
}
use inc\lib\Test1;
use inc\lib\Test2;
use inc\lib\Test3;
echo Test1::class,'<br>';
echo Test2::class,'<br>';
echo Test3::class,'<br>';
- 总结:
- 完全限定名称: 可以看作是绝对路径,总是从全局空间开始, 前面总是一个: “\” , “\A\B…”
- 限定名称: 可以看作是相对路径,类名总是会有一个或多个空间名称,但不是从全局开始, “A\B…”
- 非限定名称: 当前类里的成员,就是不带有空间名称的类 “ User”
- 类的自动加载可以跨目录访问