非限定名称:当引用语句和声明语句的命名空间在同一空间时,可以直接使用成员们,前面不用加'\'
成员前面不能有任何的命名空间,不能有"\", 理解成文件当前路径
限定名称:当引用成员语句在声明语句的空间上级时,可以从当前空间可以引用成员,但不是从根空间开始,
成员名称前面至少要一个命名空间, 至少要有一个反斜线\, 且不能在首位, 理解成:相对路径
完全限定名称:总是从根空间开始,第一个字符一定是反斜线,根空间, 理解成绝对路径
<?php namespace A\B\C; function getName() { echo __NAMESPACE__, '<br>'; } const PI = 3.14; class Student { public $stu_name; public $stu_age; } //非限定空间服访问 $student = new Student; getName(); echo PI; echo '<hr>'; namespace A\B; //限定空间访问 $student = new C\Student; C\getName(); echo C\PI; echo '<hr>'; //完全限定空间访问 $student = new \A\B\C\Student; \A\B\C\getName(); echo \A\B\C\PI;
类别名:当前命名空间下如果存在与引入类相同的类名,则引入类需要进行别名设置,否则会和当前空间的类冲突报错
空间别名:当引入一个空间路径很长经常需要使用,可以给命名空间设置一个别名,方便后面使用
<?php //类别名与空间别名 namespace ns1; class User { public static function list() { return '这是列表页'; } public static function update() { return '这是修改页'; } } class Test { } namespace ns2; class User { public static function list() { return '这是列表页'; } public static function update() { return '这是修改页'; } } class Test { } namespace ns3; class Test { } //类别名,ns3空间已经有一个Test类了在引入的话会报错,需要把引入的Test类重新起一个别名 use \ns1\Test as T1; use \ns2\Test as T2; //命名空间别名 use \ns1 as n1; echo n1\User::list(); echo '<hr>'; use \ns2 as n2; echo n2\User::update();
3.类文件自动加载
当PHP文件有时需要引入其他的类文件名,如果都是用require引入很繁琐,而且有时一个文件需要十几个类文件都使用require的话代码很冗长。这是可以写一个文件专门负责引入需要用到的类文件,当PHP文件执行到没有当前的类时会自动调用自动加载文件引入需要的类文件使程序不会保存继续执行下去。
<?php //自动加载 try { spl_autoload_register(function ($className) { //1.将命名空间分隔符转换为目录分隔符 $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); //2. 生成真正要加载的类文件名称 $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php'; //3.加载这个文件 require $file; }); } catch (Exception $e) { }
总结:命名空间知识在后面学习框架的时候用的很多,三种访问形式非限定空间访问、限定空间访问以及完全限定空间访问可以结合电脑磁盘文件来记忆,非限定空间访问指的在同一个文件夹下查找另一个文件;限定空间访问指的是相对路径,要访问的文件在当前文件夹的子文件夹;完全限定空间访问等于回到电脑磁盘来进行访问文件,相当于绝对路径。 命名空间别名是为了方便后面引用命名空间下的成员而引入的,类别名是当前空间下有一个与当前引入相同的成员时需要进行类别名。
类文件自动加载在框架中应用的很多,使得类文件不用都需要使用require语句来引入。