PHP命名空间简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asty9000/article/details/83315590

PHP从5.3起支持命名空间,PHP中的命名空间用来解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突的问题,还可以为为很长的标识符名称创建一个别名,提高源代码的可读性。 命名空间可以将相关的类、函数和常量组合到一起。

命名空间通过namespace关键字来声明。如果一个文件中包含命名空间,它必须在除了declare关键字以外的其它所有代码之前进行声明。所有非PHP代码包括空白符都不能出现在命名空间的声明之前。与其他语言不同的是PHP允许在多个文件中命名相同的命名空间,也可以在一个文件中定义多个命名空间。PHP允许指定层次化的命名空间名称(通过反斜杠“\”),与目录和文件的关系很像。

定义命名空间有两种方式:

一种是直接组合。

<?php
namespace a;

const con = 1;
class A{}
function foo(){}

namespace b;

const con = 1;
class A{}
function foo(){}
?>

另一种是使用大括号。

<?php
namespace a{

const con = 1;
class A{}
function foo(){}
}
namespace b{

const con = 1;
class A{}
function foo(){}
}
?>

不提倡同一个文件中定义多个命名空间,并且不建议使用第一种方式定义多个命名空间。如果需要将全局的非命名空间代码与命名空间中的代码组合在一起,只能使用第二种方式。全局代码必须用一个不带名称的namespace关键字用大括号将全局的代码括起来。

<?php
namespace a{

const con = 1;
class A{}
function foo(){}
}
namespace {

const con = 1;
class A{}
function foo(){}
}
?>

 命名空间中的元素的使用方法:

1.非限定名称(不包含前缀),会解析为在当前命名空间的中类、函数或常量。但是要注意的是,如果当前命名空间中未定义调用的函数或常量,则会解析为全局的函数或常量。

2.限定名称(包含前缀),会解析为当前命名空间下前缀指定的子命名空间中的类、函数或常量。

3.完全限定名称(包含全局前缀),总是呗解析为代码中指定命名空间中的类、函数或常量。

4.如果在命名空间内部想要访问全局类、函数或常量,可以使用全局前缀。

<?php
namespace {
const test="test";
const con=0;
function test(){
    echo 'test in global'."\n";
}
}

namespace a\b\c{
const con = 2;
class A{
    static function foo(){
        echo 'foo in a\b\c\A'."\n";
    }
}
function foo(){
    echo 'foo in a\b\c\foo'."\n";
}
}

namespace a\b{
const con = 1;
const test="a\b\\test";
class A{
    static function foo(){
        echo 'foo in a\b\A'."\n";
    }
}
function foo(){
    echo 'foo in a\b\foo'."\n";
}
//非限定名称
foo();
A::foo();
echo con."\n";
//非限定名称调用时,若当前命名空间中未定义,则调用全局命名空间中的函数或常量
echo test."\n";
echo test();

//限定名称
c\foo();
c\A::foo();
echo c\con."\n";
//完全限定名称
\a\b\c\foo();
\a\b\c\A::foo();
echo \a\b\c\con."\n";
//全局的常量con
echo \con."\n";
}
?>

猜你喜欢

转载自blog.csdn.net/asty9000/article/details/83315590