一、认识命名空间
1-为什么要命名空间,它可以解决以下哪些问题:
1)用户编写的代码与 PHP 内部的类(接口)/函数/常量或第三方类/函数/常量之间的名字冲突。
2)为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
2-命名空间的三种引用方式:
1)非限定名称:当引用语句和声明语句的命名空间在同一空间时,可以直接使用成员们,前面不用加'\',成员前面不能有任何的命名空间,不能有"\", 理解成文件当前路径。
2)限定名称:当引用成员语句在声明语句的空间上级时,可以从当前空间可以引用成员,但不是从根空间开始,成员名称前面至少要一个命名空间, 至少要有一个反斜线\, 且不能在首位, 理解成相对路径。
3)完全限定名称:总是从根空间开始,第一个字符一定是反斜线,根空间, 理解成绝对路径。
3-实例说明
<?php //创建空间Emy namespace Emy; class Feedback { } //非限定名称,表示当前Emy空间 //这个调用将被解析成 Emy\Feedback(); $Emy_Feedback = new Feedback(); //限定名称,表示相对于Emy空间 //这个调用将被解析成 Emy\Blog\Feedback(); $Blog_Feedback = new Blog\Feedback(); //类前面没有反斜杆\ //完全限定名称,表示绝对于Emy空间 //这个调用将被解析成 Emy\Feedback(); $Blog_Feedback = new \Emy\Feedback(); //类前面有反斜杆\ //完全限定名称,表示绝对于Emy空间 //这个调用将被解析成 Emy\Blog\Feedback(); $Blog_Feedback = new \Emy\Blog\Feedback(); //类前面有反斜杆\ //创建Emy的子空间Blog namespace Emy\Blog; class Feedback { }
二、命名空间别名、类别名
类别名:当前命名空间下如果存在与引入类相同的类名,则引入类需要进行别名设置,否则会和当前空间的类冲突报错。
空间别名:当引入一个空间路径很长经常需要使用,可以给命名空间设置一个别名,方便后面使用。
实例说明:
<?php namespace Grade{ class username{ public static function username(){ return "Emy "; } } class city{ public static function city(){ return "foshan"; } } } namespace Infor{ //命名空间别名 use Grade as U; echo U\username::username(); echo "<hr>"; //命名类别名 use Grade\city as N; echo N::city(); } ?>
运行图:
三、类文件的自动加载器实现的原理与实现
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且require_once的代价很大。
当加载PHP类时,在PHP5.1.2版本后,可以使用spl_autoload_register函数自定义自动加载处理函数。当没有调用此函数,默认情况下会使用SPL自定义的spl_autoload函数。
<?php //自动加载 try { spl_autoload_register(function ($className) { //1.将命名空间分隔符转换为目录分隔符 $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); //2. 生成真正要加载的类文件名称 $file = __DIR__ . '/0505/' . $path . '.php'; //3.加载这个文件 require $file; }); } catch (Exception $f ) { }
四、总结:了解了命名空间的三种引用方式,类文件的自动加载类实现与作用。最需要学习的是在接下来的实战中怎么运用这些知识。