php命名空间

来源:互联网 发布:淘宝网平板电脑价格 编辑:程序博客网 时间:2024/06/06 08:50

php命名空间

一、命名空间概述
命名空间其实就是一个虚拟目录的概念,用于区分不同的 类、常量、函数,每次php运行时,会将include进来的文件按所定义的命名空间 分别放在不同的虚拟目录中,如果需要使用,则需要按目录去加载。
需要注意的是命名空间和文件 include的路径是完全不一样的,文件实体路径是需要include进来的,一旦include进来,则执行到的时候就会按照谇文件的namespace定义 去加载命名空间
命名空间是独立于实体目录的一个虚拟目录,完全按文件开头的定义来

二、命名空间定义

namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }

则下面的都会有命名空间MyProject中
如果没有定义namespace,则默认是在全局命名空间 / 之下。

三、命名空间的使用
在有了命名空间之后,有三种引用方式
1、相对类名new foo() 这种属于相对路径,会去找当前命名空间下的foo类
2、相对类名new test/foo();这种类名会去找当前命名空间下的test/foo()类
3、绝对类名/test/foo();这种/是全局命名空间下的类名
和*unix目录是一个概念
而每一种也称为非限定名称(没有命名空间指定),每二种是限定名称(指定了但不是全局),每三种是完全限定名称(绝对路径直接指定)

注意: 后备全局函数/常量
对于类、函数、常量,在使用非限定名称(也就是没有加命名空间指定)时,会有不同的优先策略来解析该名称。
如果是类,则会找当前命名空间下的类,如果没有,则会报错。
而函数和常量,如果当前命名空间下没有,则会使用全局命名空间下的。
在thinkphp中,可以解释这个问题:

namespace Home\Controller;require THINK_PATH.'/test/test.php';//use Think\Controller;class IndexController extends \Think\Controller {    public function index(){        echo 1;        $c = C('COOKIE_PATH');        test();        $a = new \test();    }}

如我创建了test.php文件,里面定义了test()函数和test类,没有定义命名空间,则默认在全局命名空间下,引入了这个文件,在执行时,test()函数的使用是非限定名称的,当前命名空间Home\Controller并没有这个函数,则会去全局命名空间找,就可以找到。
而test()类的使用必须加上\来限定命名空间,因为对于类,如果没有加命名空间,则只会找当前命名空间下,如果没有则会报错。

就像Controller这个类必须要指定命名空间,而在function.php中定义的一些函数不需要命名空间是一个道理。

具体可以看php手册
http://php.net/manual/zh/language.namespaces.rationale.php

0 0
原创粉丝点击