盐城新闻网,扬州旅游团,不知火舞被虐小游戏
本文实例讲述了php命名空间(namespace)原理与用法。分享给大家供大家参考,具体如下:
php 命名空间(namespace)是在php 5.3中加入的,它可以解决以下两类问题:
我们在默认情况下,所有常量、类和函数名都放在全局空间下,就和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() { /* ... */ } ?>
不过我不建议使用这种语法在单个文件中定义多个命名空间,有需要的话,可以使用大括号形式的语法,如下:
<?php namespace myproject { const connect_ok = 1; class connection { /* ... */ } function connect() { /* ... */ } } namespace anotherproject { const connect_ok = 1; class connection { /* ... */ } function connect() { /* ... */ } } ?>
我们如果要将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法,并且全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,如下:
<?php namespace myproject { const connect_ok = 1; class connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全局代码 session_start(); $a = myproject\connect(); echo myproject\connection::start(); } ?>
我们在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,要记住,除了这个之外的所有非 php 代码包括空白符都不能出现在命名空间的声明之前,如下:
<?php declare(encoding='utf-8'); //定义多个命名空间和不包含在命名空间中的代码 namespace myproject { const connect_ok = 1; class connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全局代码 session_start(); $a = myproject\connect(); echo myproject\connection::start(); } ?>
看个错误的写法:
<html> <?php namespace myproject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
与目录和文件的关系很像,php 命名空间也允许指定层次化的命名空间的名称,因此,命名空间的名字可以使用分层次的方式定义,模式如下:
<?php namespace myproject\sub\level; //声明分层次的单个命名空间 const connect_ok = 1; class connection { /* ... */ } function connect() { /* ... */ } ?>
上述代码中,创建了常量 myproject\sub\level\connect_ok,类 myproject\sub\level\connection 和函数 myproject\sub\level\connect。
咱们再来看下php 命名空间中的类名的引用方式:
咱们用来个文件来演示下,首先来看f1.php的代码:
<?php namespace foo\bar\subnamespace; const foo = 1; function foo() {} class foo { static function staticmethod() {} } ?>
之后就是f2.php的代码:
<?php namespace foo\bar; include 'f1.php'; const foo = 2; function foo() {} class foo { static function staticmethod() {} } /* 非限定名称 */ foo(); // 解析为函数 foo\bar\foo foo::staticmethod(); // 解析为类 foo\bar\foo ,方法为 staticmethod echo foo; // 解析为常量 foo\bar\foo /* 限定名称 */ subnamespace\foo(); // 解析为函数 foo\bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 foo\bar\subnamespace\foo, // 以及类的方法 staticmethod echo subnamespace\foo; // 解析为常量 foo\bar\subnamespace\foo /* 完全限定名称 */ \foo\bar\foo(); // 解析为函数 foo\bar\foo \foo\bar\foo::staticmethod(); // 解析为类 foo\bar\foo, 以及类的方法 staticmethod echo \foo\bar\foo; // 解析为常量 foo\bar\foo ?>
我们访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \exception 或 \ini_all。之后,咱们再来看下在命名空间内部访问全局类、函数和常量的实例:
<?php namespace foo; function strlen() {} const ini_all = 3; class exception {} $a = \strlen('hi'); // 调用全局函数strlen $b = \ini_all; // 访问全局常量 ini_all $c = new \exception('error'); // 实例化全局类 exception ?>
php 命名空间的实现受到其语言自身的动态特征的影响,我们先来看一段代码:
<?php class 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 funcname echo constant('constname'), "\n"; // prints global ?>
我们如果要将上述的代码转换到命名空间中,并且动态访问元素,就必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。如下:
<?php namespace 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\funcname echo constant('\namespacename\constname'), "\n"; // 输出 namespaced echo constant('namespacename\constname'), "\n"; // 输出 namespaced ?>
好啦,本次记录就到这里了,后续的记录会在之后的文章中有体现。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
php的instanceof和判断闭包Closure操作示例
php数组函数array_push()、array_pop()及array_shift()简单用法示例
yii2.0框架实现上传excel文件后导入到数据库的方法示例
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
网友评论