PHP5.3 命名空间namespace 翻译

PHP中的命名空间用来解决大型PHP库(libraries)中作用域的问题,在PHP中,所有的类定义都是全局的,所以,当一个库的作者为这处库创建多种应用或公共API类的时候,他必须清楚其他库中相似功能是否存在的可能性并因而选择唯一的名称,来保证这些库可以被同时使用.通常用唯一的字符串加前缀的方法来解决,如数据库类被冠以My_Library_DB,等等.当这个库增加的时候,前缀也随着增加,这样导致很长的名字.命名空间使开发者在每次引用类的时候不使用长名称即可管理命名范
围.

定义
命名空间在每一个文件的开头以namespace 关键字来声明,如
<?php
    namespace MyProject::DB;
   
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
   
    function connect() { /* ... */  }
   
?>
相同的namespace 名称可以在多个文件中使用
namespace 包class,constant和function定义,但无free code
详解:
在命名空间内部,所有定义的class,function和constant名称被自动冠以命名空间名称,类名总是完整的名称,如,以上例子中的类使用MyProject::DB::Connection
来调用
创建的常量,名称是由命名空间名加上常量名,象类常量、命名空间常量只能为静态常量。

非完整修饰名(如名称不包含::),遵循如下:
非自动加载类在当前命名空间(冠以命名空间名称的)中查找
非自动加载全局命名空间中查找
Autoloading for name in current namespace is attempted.
如前者查找失败,则查找失败

非完整修饰函数名称(如名称不包含::)先在当前命名空间查找再在全局空间中查找
非完整修饰常量名称称在当前命名空间中查找再在全局定义的常量里查找

使用命名空间
每一个命名空间里的类和函数可使用全名来引用,如,MyProject::DB::Connection ,或MyProject::DB::Connection
<?php
    require 'MyProject/Db/Connection.php';
    $x = new MyProject::DB::Connection;
    MyProject::DB::connect();
?>
命名空间可以使用use操作符来引入到当前上下文(全局或命名空间)中,这个操作符参数如下:
<?php
/* ... */
use Some::Name as Othername;
// 简化应用
use Foo::Bar;
// 与其相同
use Foo::Bar as Bar;
?>
引入的名称工作如下:每次当解释器遇到局部名称Othername(单一名称或被::分隔的长名称),引入的名称Some::Name被替代
use只能用于全局范围内,非函数或类中,引入的名称从引入开始到当前文件结尾有效,推荐在文件最开始引入以避免冲突
<?php
    require 'MyProject/Db/Connection.php';
    use MyProject::DB;
    use MyProject::DB::Connection as DbConnection;
   
    $x = new MyProject::DB::Connection();
    $y = new DB::connection();
    $z = new DbConnection();
    DB::connect();
?>
全局空间
没有命名空间定义时,所有的类和函数都被放在全局空间内,因为在PHP支持命名空间前就是这样的.
在命名空间上下文中,被冠以::将指定来自全局空间里该名称
<?php
    namespace A::B::C;

/* 此函数为 A::B::C::fopen */
    function fopen() {
         /* ... */
         $f = ::fopen(...); // 全局函数
         return $f;
    }
?>
__NAMESPACE__
解释期间的常量__NAMESPACE__被定义为当前命名空间的名称,在命名空间外部,这个常量值为空字符串.
<?php
namespace A::B::C;
         
function foo() {
// do stuff
}
set_error_handler(__NAMESPACE__ . "::foo");
?>
规则
1.所有完整修饰名通过当前引入规则转化,如A::B::C已引入,C::D::E()被转化为A::B::C::D::e().
2.非完整修饰名通过当前引入规则转化(全名替换简名),如A::B::C已引入,new C()被转化为A::B::C().
3.在命名空间内部,调用当前命名空间内定义的非完整修饰函数名,在解释期间被认为是调用这些命名空间的函数
4.在命名空间内部(A::B),调用在当前命名空间内没有定义的非完整修饰名函数在运行期间被决定,以下是Foo()如何被决定
在当前命名空间内寻找函数A::B::foo().
尝试寻找和调用内部(internal)函数foo()
调用全局空间内用户定义的函数,使用::foo()
5.在命名空间内部(A::B),调用在当前命名空间内没有定义的非完整修饰名类在运行期间被决定,以下是 new C() 如何被决定.
在当前命名空间A::B::C中寻找类
尝试寻找和调用内部类C
尝试自动加载A::B::C
调用全局空间内用户自定义的类,使用new ::c()
6.调用完整修饰名的函数在运行期间被决定.以下是A::B::foo() 如何被决定
在当前命名空间内寻找函数A::B::foo().
调用全局空间内用户定义的函数,使用::foo()
7.调用完整修饰名的类的时候,是在运行的时候才按照想对应的命名空间来加载。比如 new A::B::C() 它是引用 命名空间是A::B下的C() 类
<?php
namespace A;
// 函数调用
foo();      // 先尝试调用命名空间A里定义的"foo
            // 再调用内部(internal)函数 "foo"
::foo();    // 调用全局范围内定义的"foo"
// 类引用
new B();    // 先尝试创建在命名空间A定义的B类的对象
            // 再创建内部类B对象
new ::B();  //新建全局域定义的B类的对象
// 来自其他命名空间的静态方法/命名空间
B::foo();   //先尝试调用来自命名空间"A::B"的函数foo()
            // 再调用内部类B的函数foo()
::B::foo(); //先尝试调用来自命名空间B的函数FOO()  
            //再调用全局域里B里的函数FOO()
//当前命名空间的静态方法/命名空间
A::foo();   //先调用命名空间"A::A" 里的函数FOO()
            // 再调用命名空间A里A类的函数foo()
            // 再尝试调用命名空间A里函数foo()
            // 再调用内部类A里的函数foo()
::A::foo(); // 先尝试调用命名空间A里函数foo()
            // 再调用全局域里A类的函数foo()
?>

时间: 2024-10-28 23:31:35

PHP5.3 命名空间namespace 翻译的相关文章

PHP命名空间(Namespace)的使用详解

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

PHP命名空间(Namespace)的使用详解_php实例

对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个模块:article和message board,它们各自有一个处理用户留言的类Comment.之后我可能想要增加对所有用户留言的一些信息统计功能,比如说我想得到所有留言的数量.这时候调用它们Comment提供的方法是很好的

php命名空间 namespace

php命名空间 namespace 官方说法是: 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突. 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性. 其实命名空间就是为了解决引入不同的文件存在了两个相同的类的情况,其中 __NAMESPACE__ 可以获取namespace的名称. 例如,我有一个index文

PHP命名空间(namespace)的使用基础及示例_php实例

PHP的命名空间(namespace)是PHP 5.3中加入最重要的一个新特性,这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 一. PHP的命名空间主要解决三种冲突的问题:常量,函数,类 通俗理解:namespace就相当于是用来建一个目录,将namespace下面的代码放在该目录里面,与外面的区分开来. /* |--------------------------------- |namespace示例 |@黑眼诗人 <www.chenwei.ws>

PHP命名空间(namespace)的动态访问及使用技巧_php实例

PHP的命名空间(namespace)是PHP 5.3中加入最重要的一个新特性,这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 一.动态访问命名空间的元素 namespace me\poet; function test() { echo '1111'; } $fun = 'test';//不能这么用,最后$fun()无法动态调用到test():Fatal error: Call to undefined function test() $fun = '\

PHP命名空间namespace用法实例分析_php技巧

本文实例讲述了PHP命名空间namespace用法.分享给大家供大家参考,具体如下: namespace(命名空间)相当于函数.类,划分了一个区域,这样子就使得在同个页面中可以require相同的类,使用相同名字的函数 : 在项目中比较少用 name.php: <?php //命名要使用复合名称 namespace me\mine; class me{ public function __construct(){ echo 'name'.'<br>'; } public function

浅析JavaScript中命名空间namespace模式_javascript技巧

namespace即"命名空间",也称"名称空间" ."名字空间".JavaScript不像C#或Java,有专门的namespace和package语法支持,当JS复杂到一定程度,尤其是引用大量的第三方JS框架和类库之后,命名冲突就会成为一个严重的问题,因此使用JS自己的变通方式建立命名空间很重要. 命名空间有助于减少程序中所需要的全局变量的数量,并且同时有助于避免命名冲突或过长的名字前缀. 关于命名空间的例子: /** * 创建全局对象MYA

浅谈几种常见语言的命名空间(Namespace)_C 语言

命名空间提供了一种从逻辑上组织类的方式,防止命名冲突. 几种常见语言 C++ 命名空间是可以嵌套的 嵌套的命名空间是指定义在其他命名空间中的命名空间.嵌套的命名空间是一个嵌套的作用域,内层命名空间声明的名字将隐藏外层命名空间声明的同名成员: int x = 20; namespace outer { int x = 10; namespace inner { int z = x; } } int main() { std::cout << outer::inner::z; // 输出10 re

php中命名空间namespace用法介绍

  现在说这个,感觉有点过时了,但是感觉用namespace的人还是不多,估计还是因为不习惯吧. class把一个一个function组织起来,namespace可以理解成把一个一个class,function等有序的组织起来.个人觉得,namespace的主要优势有 第一,可以更好的管理代码 第二,文件一多,可以避免class,function的重名 第三,代码可读性增强了 1,定义namespace 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 name