首页 > 作文

PHP命名空间(namespace)原理与用法详解

更新时间:2023-04-08 04:27:29 阅读: 评论:0

本文实例讲述了php命名空间(namespace)原理与用法。分享给大家供大家参考,具体如下:

php 命名空间(namespace)是在php 5.3中加入的,它可以解决以下两类问题:

用户编写的代码与php内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

我们在默认情况下,所有常量、类和函数名都放在全局空间下,就和php支持命名空间之前一样,命名空间通过关键字namespace 来声明,如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。我们来看下语法:

<?php // 定义代码在 'myproject' 命名空间中 namespace myproject; // ... 代码 ...

我们也可以在同一个文件中定义不同的命名空间代码,如下:

<?php namespace myproject;const connect_ok = 1;class connection { /* ... */ }function connect() { /* ... */ }namespace anotherproject;const connect_ok = 1;class connection { /* ... */ }function connect腊八节的传说() { /* ... */ }?>

不过我不建议使用这种语法在单个文件中定义多个命名空间,有需要的话,可以使用大括号形式的语法,如下:

<?phpnamespace myproject {  const connect_ok = 1;  class connection { /* ... */ }  function connect() { /* ... */ }}namespace anotherproject {  const connect_ok = 1;  class connection { /* ... */ }  function connect() { /* ... */ }}?>

我们如果要将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法,并且全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,如下:

<?phpnamespace myproject {const connect_ok = 1;class connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代码ssion_start();$a = myproject\connect();echo myproject\connection::start();}?>

我们在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,要记住,除了这个之外的所有非 php 代码包括空白符都不能出现在命名空间的声明之前,如下:

<?phpdeclare(encoding='utf-8'); //定义多个命名空间和不包含在命名空间中的代码namespace myproject {const connect_ok = 1;class connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代码ssion_start();$a = myproject\connect();echo myproject\connection::start();}?>

看个错误的写法:

<html><?phpnamespace myproject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句?>

与目录和文件的关系很像,php 命名空间也允许指定层次化的命名空间的名称,因此,命名空间的名字可以使用分层次的方式定义,模式如下:

<?phpnamespace myproject\sub\level; //声明分层次的单个命名空间const connect_ok = 1;class connection { /* ... */ }function connect() { /* ... */ }?>

上述代码中,创建了常量 myproject\sub\level\connect_ok,类 myproject\sub\level\connection 和函数 myproject\sub\level\co当代中国nnect。

咱们再来看下php 命名空间爱情的味道中的类名的引用方式:

非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定节俭的事例的函数名称或常量名称会被解析为全局函数名称或常量名称。限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

咱们用来个文件来演示下,首先来看f1.php的代码:

<?phpnamespace foo\bar\subnamespace; const foo = 1;function foo() {}class foo{  static function staticmethod() {}}?>

之后就是f2.php的代码:

<?phpnamespace foo\bar;include 'f1.php';const foo = 2;function foo() {}class foo{  static function staticmethod() {}}/* 非限定名称 */foo(); // 解析为函数 foo\bar\foofoo::staticmethod(); // 解析为类 foo\bar\foo ,方法为 staticmethodecho foo; // 解析为常量 foo\bar\foo/* 限定名称 */subnamespace\foo(); // 解析为函数 foo\bar\subnamespace\foosubnamespace\foo::staticmethod(); // 解析为类 foo\bar\subnamespace\foo,                 // 以及类的方法 staticmethodecho subnamespace\foo; // 解析为常量 foo\bar\subnamespace\foo/* 完全限定名称 */\foo\bar\foo(); // 解析为函数 foo\bar\foo\foo\bar\foo::staticmethod(); // 解析为类 foo\bar\foo, 以及类的方法 staticmethodecho \foo\bar\foo; // 解析为常量 foo\bar\foo?>

我们访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \exception 或 \ini_all。之后,咱们再来看下在命名空间内部高三化学教学工作总结访问全局类、函数和常量的实例:

<?phpnamespace foo;function strlen() {}const ini_all = 3;class exception {}$a = \strlen('hi'); // 调用全局函数strlen$b = \ini_all; // 访问全局常量 ini_all$c = new \exception('error'); // 实例化全局类 exception?>

php 命名空间的实现受到其语言自身的动态特征的影响,我们先来看一段代码:

<?phpclass classname{  function __construct()  {    echo __method__,"\n";  }}function funcname(){  echo __function__,"\n";}const constname = "global";$a = 'classname';$obj = new $a; // prints classname::__construct$b = 'funcname';$b(); // prints funcnameecho constant('constname'), "\n"; // prints global?>

我们如果要将上述的代码转换到命名空间中,并且动态访问元素,就必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。如下:

<?phpnamespace namespacename;class classname{  function __construct()  {    echo __method__,"\n";  }}function funcname(){  echo __function__,"\n";}const constname = "namespaced";include 'example1.php';$a = 'classname';$obj = new $a; // 输出 classname::__construct$b = 'funcname';$b(); // 输出函数名echo constant('constname'), "\n"; // 输出 global/* 如果使用双引号,使用方法为 "\\namespacename\\classname"*/$a = '\namespacename\classname';$obj = new $a; // 输出 namespacename\classname::__construct$a = 'namespacename\classname';$obj = new $a; // 输出 namespacename\classname::__construct$b = 'namespacename\funcname';$b(); // 输出 namespacename\funcname$b = '\namespacename\funcname';$b(); // 输出 namespacename\funcnameecho constant('\namespacename\constname'), "\n"; // 输出 namespacedecho constant('namespacename\constname'), "\n"; // 输出 namespaced?>

好啦,本次记录就到这里了,后续的记录会在之后的文章中有体现。

本文发布于:2023-04-08 04:27:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/3f4312066dadcd1e644bbf1f7bbc392d.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP命名空间(namespace)原理与用法详解.doc

本文 PDF 下载地址:PHP命名空间(namespace)原理与用法详解.pdf

标签:空间   名称   常量   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图