注册 登录

清河洛

php中的命名空间

qingheluo2021-01-31清河洛830
PHP命名空间(namespace)是在PHP5.3中加入的,可以解决以下两类问题:1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。使用namespace关键字定义命名空间定义命名空间的语法格式语法格式1:namespace 命名空间1; ... namespace 命名空间2; ... 直到下一个namespace语句之前的所有代码都属于该命名空间 语法格式2:namespace 命名空间1{...} namespace 命名空间2{...} ...

PHP命名空间(namespace)是在PHP5.3中加入的,可以解决以下两类问题:

1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

使用namespace关键字定义命名空间

定义命名空间的语法格式

语法格式1:

namespace 命名空间1;
...
namespace 命名空间2;
...
直到下一个namespace语句之前的所有代码都属于该命名空间

语法格式2:

namespace 命名空间1{...}
namespace 命名空间2{...}
当一个文件中有多个命名空间时推荐使用语法格式2

如果一个文件中有全局的命名空间,只能使用语法格式2(大括号形式),全局代码用一个不带名称的namespace语句

namespace 命名空间1{...}
namespace {...//全局代码}

1、命名空间可以有多个层级,各个层级之间使用反斜杠""分隔(one\two\three...)

2、在声明命名空间之前唯一合法的代码是declare(encoding="")语句,其他所有非PHP代码包括空白符都不能出现

<html>
<?php
$name='qingheluo';
namespace Myjob\Myname\info;
?>
命名空间前出现了非php代码"<html>",会致命错误
命名空间前出现了非declare语句的php代码"$name='qingheluo'",会致命错误

常量__NAMESPACE__表示当前命名空间名称的字符串

命名空间的使用

1、非限定名称,不包含命名空间前缀,如new foo()
    会解析为该代码所在命名空间
    如果在改代码所在命名空间没有找到指定类或变量,会被解析为全局类或变量
2、限定名称,使用相对路径形式的命名空间前缀,如new mynamespace\foo()
    会在命名空间之前加上该代码所在命名空间
3、完全限定名称,使用绝对路径形式的命名空间前缀,如new \mynamespace\foo()
    会在全局中寻找指定命名空间
    使用new \foo()表示全局命名空间中的类或变量

命名空间的导入和别名

如果命名空间很长那么会给编写和阅读带来困扰,我们可以使用别名来缩短过长的命名空间

php命名空间可以定义命名空间、类名和函数名的别名

在命名空间内引入其他文件不会属于本命名空间,而属于公共空间或是文件中本身定义的命名空间

use关键字用来定义命名空间和类名的别名
    use Myjob\Myname\info as new_Name
    use Myjob\Myname\info\ClassName as new_ClassName
use function关键字用来定义函数的别名
    use function Myjob\Myname\info\func_name as new_func_name;

as语句可以省略,表示使用最后一个名称作为别名

    use Myjob\Myname\info等同于
        use Myjob\Myname\info as info
    use Myjob\Myname\info\ClassName等同于
        use Myjob\Myname\info\ClassName as ClassName
    use function Myjob\Myname\info\func_name等同于
        use function Myjob\Myname\info\func_name as new_func_name;

一行use语句可以定义多个别名

use Myjob\Myname\info,Myjob\Myname\info\ClassName,...

导入操作是在编译执行的,动态的类名和函数名则不是

use Myjob\Myname\info\ClassName as Myclass
$obj = new Myclass; //实例化一个Myjob\Myname\info\ClassName对象
$a = 'Myclass';
$obj = new $a;      //实际化一个Another对象

导入操作只影响相对路径和无路径。完全限定名称由于是确定的,故不受导入的影响。

use Myjob\Myname\info\ClassName as Myclass
$obj = new \Myclass; // 实例化Myclass类

关键字namespace可用来显式访问当前命名空间中的元素

<?php
namespace Myjob;
use Other\obj as mine;
mine\mine(); //调用函数 Other\obj\mine()
namespace\obj\mine(); //调用函数 Myjob\obj\mine()
?>


网址导航