美文网首页
PHP命名空间和自动加载的理解

PHP命名空间和自动加载的理解

作者: 蔡先森_a1e2 | 来源:发表于2018-06-22 17:04 被阅读0次

        你有没有想过,在我们的项目中有这么多的类名,函数名,如果万一重复了呢,怎么办,这个还好说,毕竟是自己写的,可以改一下,但是万一我们引入了一个外部的类库文件,引起的类名重复呢,怎么办,是不是很头疼,所以php在5.3版本后加入了命名空间这个概念,就是为了解决类名冲突这个问题的,php手册是这样描述命名空间的作用的的:

    1)用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

    2)为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

    请看下面的例子:

    我们有一个文件index.php.里面定义了类one,然后包含了同级目录下的name.php文件,但是不幸的是

    index.php内容 name.php内容

    name.php文件里面也有一个类名为one的,那这样我们运行index.php的时候就会报错(Fatal error: Cannot declare class one, because the name is already in use in...),因为程序不知道我们实例化的到底是哪个文件里面的类one,所以这个时候命名空间的作用就来了,我们只要在name.php最开头加入namespace className/test;就行了,

    name.php index.php

    这样我们运行index.php的代码就不会报错了,一定一定要注意在实例化name.php的类的时候在最前面一定要加上\,告诉PHP从根命名空间而不是当前的命名空间开始搜索,如果没有\,PHP会去搜索className\one\className\text\命名空间下的one类.所以啊,一定不能忘记加上\

    可能还有人说了new \className/text\one()这么写也太麻烦了,万一要是我的命名空间更长的话,那不是超级无敌麻烦吗,也对,但是PHP也给出了相应的办法,利用use来给命名空间取别名,

    看到了吗,.我加了一行代码use className\text as hello; 这样我们在实例化的时候就可以用hello\one()代替上面那一串长长的实例话的代码了,其实把use还有一个特性就是如果你不主动as取别名的话那么他会自动用最后一个单词作为别名.就像这样也是一样滴;

    其实命名空间真的就这么点东西,只要理解了还是挺简单的;那么什么是自动加载呢,自动加载其实就是当我们在实例化一个类的时候系统通过自动加载来自动的加载进来我们实例化的这类,这样我们就不用在每个文件里面写require_once了,万一要包含进来几十个文件,那不是爆炸了啊,那他是怎么实现的,其实也简单,通过解析类名,然后得到这个类的实际的文件目录,然后加载进来,这样就需要我们的命名空间符合一定的规律了,这个规律好像叫psr-4的规范,反正大体的意思就是命名空间的声明要跟目录名对应起来,

    可以参考这篇文章,讲的非常好:https://www.cnblogs.com/woider/p/6443854.html

    相关文章

      网友评论

          本文标题:PHP命名空间和自动加载的理解

          本文链接:https://www.haomeiwen.com/subject/kjqxyftx.html