命名空间中的三种类名称
完全限定名称:总是从全局空间开始,前面总是一个”\”,”\A\B…”
// 命名空间的别名
namespace sn1;
class T1{}
namespace sn2;
class T1{}
namespace sn3;
// 从当前空间开始访问另一空间,应该从全局开始
// 1.完全限定名称的类名:\ns1\T1,类似绝对路径
echo \ns1\T1::class,'<hr>';
限定名称:类名总是会有一个或多个空间名称,但不是从全局开始,”A\B…”
namespace sn3;
// \sn3\sub\Hello:完全限定名称的类名
// 类名可以省略掉与当前空间名称相同的部分
// 2.限定名称的类名:sub\Hello,理解成相对路径
echo sub\Hello::class,'<hr>';
namespace sn3\sub;
class Hello{}
- 非限定名称:就是不带有空间名称的类,”Hello”
namespace sn3;
class Work{}
// 访问当前空间中的类,不需添加空间名称
// 3.非限定名称的类:Work
echo Work::class,'<hr>';
类的别名
使用空间或类名的别名来简化这种调用
空间级的别名:给空间起个别名,使用关键字use
namespace sn2;
class T1{}
namespace sn3;
// 使用空间或类名的别名来简化这种调用
// 空间级的别名:给空间起个别名,使用关键字use
use \sn2 as S;
echo S\T1::class,'<hr>';
类级的别名,给完全限定名称的类起个别名
// 2.类级的别名,给完全限定名称的类起个别名
use \sn2\T1 as T;
echo T::class,'<hr>';
- 如果别名与类名相同,可以省略as以后面的别名
// 如果别名与类名相同,可以省略as以后面的别名
use \sn2\T1;
echo T1::class,'<hr>';
- 如果当前 类中也有一个与之同名的非限定的类,就不能省略别名
namespace sn2;
class T1{}
namespace sn3;
use \sn2\T1;
echo T1::class,'<hr>';
// 以下情况必须使用别名
// 如果当前 类中也有一个与之同名的非限定的类,就不能省略别名
class T1{}
类的加载
类的自动加载
// 类的自动加载
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,'<hr>';
echo Test2::class,'<hr>';
echo Test3::class,'<hr>';