简单易懂的命名空间及 use 的使用

2019年7月7日22:03:23 发表评论 16

最近一段时间在研究 php 框架,一直想的什么时候才能开发出自己的框架,当然这是为了提升自己的编程水平,同时能把平时学的零散的东西糅合在一块熟练应用。但是开发一个框架根本不知道如何做起,先开发什么,虽然 php 的框架也不少,但是都是如何应用,没有文档和视频可以学习,这是让我特别郁闷的事情,相信不少想自己开发框架玩的小伙伴都有类似的感受,郁闷归郁闷,自己还是动手做了,做的时候困难和想象的一样难,从一开始就有点蒙了。

那就是命名空间的使用及 use 引入。看了很多网上的说法,也看了官方文档,意思大概明白,也很好理解,命名空间还好说,给这个空间起个名字嘛,但是 use 具体操作起来就不行 了,怎么也搞不通。后来看一个 yii 学习视频才恍然明白。

比方说建三个文件。

第一个文件 A.php,里边有两个类,命名空间是 a\b\c;

<?php
namespace a\b\c;

class Apply{
function get_info(){
echo 'this is A Apply';
}
}

class C{
function info(){
echo 'this is info';
}
}

 

第二个文件 B.php  命名空间 a\b\d;

<?php
namespace a\b\d;

class Apply{
function get_info(){
echo 'this is B Apply';
}
}

 

第三个文件 index.php ,用来使用上边两个文件的类。

比方说我们现在想实例化 A.php 里的类,该怎么实现呢?

首先要包含这个文件 require_once('A.php');

然后 use a\b\c;? 还是 a\b\c\A?   起初我也是这么认为的。其实这是错的,use 应该是这样的,命名空间\这个空间下你要实例化类的类名。比方说我们要实例化 A.php 里的 Apply 类,那么 use a\b\c\Apply;  这就相当于引入这个类,接下来再  new Apply();调用里边的方法,跟平常是一样的。如果要实例化类 C,就 use a\b\c\C;

注意:use 不等于 require_once 或者 include,use 的前提是已经把文件包含进当前文件。

顺便提一句,在 MVC 模式中,类名和文件名是相同的,所以 use 的时候会让不了解的人以为 use 后面跟的是文件名,我之前就这么以为的。其实 use 的还是类名。

 

有的人可能问了,那我不同的命名空间下,有相同的类名,在同一个文件中使用怎么办?比方说我们上边的 index.php,把 A.php 和 B.php 都包含进来,然后 new Apply();这个时候是会报错的,解决方案就是起别名,比方说 use a\b\d\Apply as b;  此时我们 new 的时候不应该写成 new Apply();而是 new b();这样就不会发生冲突了。

历史上的今天:

  • 博主微信
  • 赶快加我来聊天吧
  • weinxin
  • 站长技术资源群
  • Q群暂已关
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: