关于命名空间
看这段代码,关于PHP命名空间的用法,这里:
class TimestampBehavior extends AttributeBehavior
这里继承了AttributeBehavior这个类,但是前面命名空间并没有use yii\behaviors\AttributeBehavior;
请问如果一个类继承的类是同一个namespace中的,是否就不用use引入呢?
回复内容:
看这段代码,关于PHP命名空间的用法,这里:
class TimestampBehavior extends AttributeBehavior
这里继承了AttributeBehavior这个类,但是前面命名空间并没有use yii\behaviors\AttributeBehavior;
请问如果一个类继承的类是同一个namespace中的,是否就不用use引入呢?
这个跟命名空间没多大关系,其实是框架自动加载,能够extends类,这个类肯定要先引入
这个与 PHP 对 “命名空间解析规则”有关,请参考:名称解析规则,其中的第 3 点和第 6 点能够给你答案。
当前文件的命名空间是 yii\behaviors
,那么该文件中“非完全限定名称”的类都将会被认为是该命名空间下的类。比如这里的父类 AttributeBehavior
会被认为是 yii\behaviors\AttributeBehavior
,所以不需要使用 use
关键字显式导入该类。而不属于当前命名空间的类,使用时必须显式声明(使用 use 或者 完全限定名称),比如 yii\db\Expression
。这个与继承无关,所以要搞清楚。
对 use
关键字的理解上是有问题的,它只是声明而并不是真正的导入该类,只有当该类被使用时,才会真正引入(require)该类。yii 是有自动加载模块的,这个不需要自己关心,只要命名空间声明正确就可以了。
注:“完全限定名称”说白了就是该类的完整的命名空间+类名。