时间:2021-07-01 10:21:17 帮助过:4人阅读
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
这个话什么意思?我做实验理解:
非限定名称
就是调用function class $的时候不加任何前缀,
就是调用代码自己所在文件中的 class 或者 $ 或者 function,这样理解对吗?
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
这个话什么意思?我做实验理解:
非限定名称
就是调用function class $的时候不加任何前缀,
就是调用代码自己所在文件中的 class 或者 $ 或者 function,这样理解对吗?
看源码吧
namespace Project\Model; //本文件隶属命名空间Project\Model,如果没有特别说明,以后出现的类名称为该空间下的类,如 User表示\Project\Model\User,Table\User表示\Project\Model\Table\User
use Zend\Table; //调用\Zend\Table这个类,使用该声明之后再调用$table = new Table();时,这个Table是指\Zend\Table
use Project\Model\Table PTable; //调用\Project\Model\Table这个类,并指定别名PTable,当调用$table = new PTable();时,这个PTable是指Project\Model\Table
//在以上代码中属于声明,不需要特别使用\开头说明是绝对路径
class User extends \Project\Model { //User无特别声明,所以该类全名为\Project\Model\User,而\Project\Model因为是反斜杠开头,指\Project\Model这个类(不能写成extends Model,否则会被认为是\Project\Model\Model)
}
class \User extends Table\User { //使用了反斜杠开头,因此该类全名就是\User,后面的User没有斜杠,则是指\Project\Model\Table\User
}
由此可见,对于namespace和use语句,其中的类使用的是全名,而在其它地方必须使用反斜杠开头表示类的全名,否则其全名是 反斜杠 + 当前的namespace + 类名
说通俗点: 命名空间就是一个文件的 位置信息(全局唯一)
比如
lib/pay/weixin.php
lib/order/weixin.php
这两个 weixin.php的空间就不同
命名空间就是为了解决class类名重复问题的
你赶紧别做实验了,会把你绕晕的