6 个回答

不是,你截图的区域还是在 Goods下
直到下一个namespace关键字开始,才属于不在Goods空间的地盘
use Money 表示new的时候,因为是在Goods空间下new的,所以默认在当前
命名空间下new的 ,引入Goods空间下面的 Money 这个类

另外在正式开发下,一个php文件 只对应一个namespace,一个类 占一个php文件

namespace Goods;这句就是命名空间。
说白了,就是把类分组。有点抽象。
差不多得弄清楚以下情况。两个类,A类调用B类
《1》A和B都是用了同一个命名空间

《2》AB都用了不同的命名空间

《3》A用了命名空间,B没用命名空间

新手上路,请多包涵

namespace Goods;//命名空间
命名空间是将代码划分出不同的空间(区域),每个空间的常量、函数、类的名字互不影响,这个有点类似我们常常提到的‘封装'的概念.
use xxx;//加载某个命名空间
namespace Goods;到namespace Car;之间都属于Goods的空间范围

示例代码并不规范,所以不太好理解。先解释下问题。

图中区域的命名间是 Goods;

namespace Goods;
class goods_category{}

use Money;
// 没有重新声明新的命名空间,这里可以直接调用相同空间下的类
new goods_category();

// use引入了一个命名空间(并不是替代),所以可以使用Money空间下的内容,假设Money下有一个Test类
new Test();//没有毛病

// 不过如果Money也有一个goods_category类,那这里要设该类就只能这样了
new Money\goods_category();

namespace Car;
// 已经重新声明命名空间为Car,所以这里就不能直接调用Goods空间下的类
// new goods_category();  Fatal error: Class 'Car\goods_category' not found 
new \Goods\goods_category(); // 不使用use的情况下只能完整加上命名空间

根据PSR规范,一个源文件只能有一个类名,并且完整的类名必须有一个最终的类名,所以也只能有一个命名空间(PSR把命名空间分为顶级命名空间和子命名空间,这里说的一个是指顶级命名空间和子命名空间合起来之后的结果)。

新手上路,请多包涵

相同的命名空间的类在调用时不必use,命名空间只是类的一个归类。不是留几个空行就是空间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题