Blogger Information
Blog 31
fans 0
comment 0
visits 30274
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP命名空间的三种引用方式与类文件的自动加载类实现
emy
Original
1548 people have browsed it

一、认识命名空间
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();
        }
    ?>

运行图:
QQ截图20200513222840.jpg

三、类文件的自动加载器实现的原理与实现

在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 ) {
}

四、总结:了解了命名空间的三种引用方式,类文件的自动加载类实现与作用。最需要学习的是在接下来的实战中怎么运用这些知识。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:理解是对的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post