时间:2021-05-26
本文实例讲述了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() { }?>不过我不建议使用这种语法在单个文件中定义多个命名空间,有需要的话,可以使用大括号形式的语法,如下:
<?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 { // 全局代码session_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 { // 全局代码session_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\Connect。
咱们再来看下PHP 命名空间中的类名的引用方式:
咱们用来个文件来演示下,首先来看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\FOOsubnamespace\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$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?>好啦,本次记录就到这里了,后续的记录会在之后的文章中有体现。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP命名空间namespace用法。分享给大家供大家参考,具体如下:namespace(命名空间)相当于函数、类,划分了一个区域,这样子就使得在
一:命名空间里的namespace关键字和__NAMESPACE__常量的运用PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术
本文实例讲述了PHP命名空间namespace定义及导入use用法。分享给大家供大家参考,具体如下:在PHP中,出现同名函数或是同名类是不被允许的。为防止编程人
本文实例讲述了PHP命名空间namespace的定义方法。分享给大家供大家参考,具体如下:定义命名空间对于空间的命名,在此我想不用文字解释,更好的解释是用实例来
本文实例讲述了PHP命名空间namespace及use的简单用法。分享给大家供大家参考,具体如下:最近一段时间在研究php框架,一直想的什么时候才能开发出自己的