博客列表 >PHP命名空间的三种引用方式与类文件的自动加载类实现

PHP命名空间的三种引用方式与类文件的自动加载类实现

emy
emy原创
2020年05月13日 22:46:221547浏览

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

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议