请教下php中namespace和use的用法及异同?
目前的理解和疑惑如下:
- namespace的作用: 命名空间为了解决重名问题, 比如同事A.php里有class A, 而同事B事先不知道A会使用什么类名, 可能会重复. 那么命名空间可以解决这问题. namespace nsa里有class A, class A只能在当前命名空间下生效.
use的作用就是在当前命名空间下使用其它命名空间下的类, 比如在(index.php里的类Index)
app\admin\controller
命名空间里使用 另一个(Db.php里有Db类)命名空间use think\Db
- 只知道这么用, 但有些东西讲不清楚.
use think\Db
= Db类的命名空间think
+ 类名Db
? 框架里是这样用的, (这里的命名空间think经过tp的修改和简化)- 再推而广之, 如果想在
A.php, namespace nsa, class A
调用B.php, namespace nsb, class B
, 就是use nsb/B
? 需要先在A.php用include或require引入B.php吗?
在网上找了很多人写的博客, 但是我发现, 因为这涉及到file_name, namespace_name, class_name, 甚至path_name和directory_name. 一些人在写文章时, 这几个名字都取得稀巴烂像a, b, aa, bb, ab,导致描述也混乱, 很容易产生歧义. 所以先事先约定以下名称
- A.php
- namespace nsa (要用多层级就namespace n/s/a)
- class A
- B.php,
- namespace nsb (要用多层级就namespace m/t/b)
- class B
- 现在简单的框架功能练习没什么问题, 但是看源代码和练习复杂功能的代码时, 面向对象和命名空间认识太浅, 导致理解有些困难. 还请大家帮忙分享下自己的经验.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
autoload
(5.1加入) 和namespace
(5.3加入),可见这俩并非 PHP 语言不可或缺,而是为了针对特定的问题所引入的一种解决方案。0.先说
symbol table
,这是根本。PHP 解释器在执行的时候,内部维护着的一个表,类似于:类名、函数名、变量名这些都是
symbol
。PHP 解释器在执行(载入)每一个 .php 文件时,遇到一个 类定义、函数定义、变量定义 就往
symbol table
添入一行(这也是为什么 PHP 解释器能够发现重复定义)。在接下来的执行中,PHP 解释器遇到 "实例化一个类" 的代码,就查一下symbol table
里type
Class
下有没有这个 类名,如果没有,则报错"类未定义"。1.有了上面的铺垫,按照加入PHP的先后顺序,先说
autoload
。上面 "实例化一个类" 的这个流程,其实是有改进余地的,在其查symbol table
没有找到类名
之后,可以插入一个步骤,这个步骤负责从文件系统找到类定义所在的.php文件
并当即载入,这个步骤,就叫autoload
。autoload
内的匹配规则是需要你动手来写的,最常见的做法是类名
和类定义所在.php文件名
两者取同名:2.在 PHP 中加入
namespace
后,其symbol table
类似于:PHP 解释器在查
symbol table
时加入了对namespace
的判断假设你给自己所有的 .php 的首行放
PHP 解释器在执行你的代码后,其
symbol table
类似于:别人在实例化 你的代码中的类 的时候,须这么写:
看看上面起分隔作用的这个
\
,眼不眼熟?有没有让你联想到 文件路径 中起分隔作用的/
?那么autoload
中的匹配规则你有想法了吗?想细究的话可以看 Composer 的实现,ThinkPHP5 的话你可以看 ProjectPath/thinkphp/library/Loader.php。
3.
use Some\NS;
不是必须的,你可以先试着不用use Some\NS;
,等你敲累了后再自行决定用不用 :)。使用了命名空间,一般会使用自动加载,当然自动加载的本质是不需要你写 require/include,只是自动加载的方法会帮你 require.
如果没有使用自动加载,你当然是需要 require 的。
其它,没看懂你还有什么问题,推荐:https://www.php.net/manual/zh... 官方手册,阅读后有什么问题,但针对手册中的描述来提问。
PSR
规范定义的命名空间,使用composer
时可以自动加载(不用手动require类文件
)namespace
定义命名空间,user
导入类