1

命名空间

在php语言里面,语法规则同名的函数、类名、常量在一个请求里不允许出现多次,如果有的程序不得以必须出现

同名的函数、类名、常量,可以吧它们放到不同的空间里面做请求,这个空间就是命名空间

命名空间针对函数、类名、常量起作用,统称为元素

常量声明

define(key,val);//忽略命名空间

const key=val; //受命名空间影响

访问元素

  1. 默认当前空间(挨着最近的空间)(非限定名称)
  2. 访问其他空间的元素 空间名元素(完全限定名称)
  3. 访问当前空间子空间的元素 当前空间子空间名元素 (限定名称) 当前空间和子空间名拼接

引入机制(降低空间书写复杂度)

空间引入

use a\b\c\d;
echo d\fun(); //通过限定名称方式访问(限定名称是引入空间名的最后一级名称)

元素引入(只能引入类)

use a\b\c\d\类名;
echo 类名::$name; //非限定名称访问
如果当前空间有元素和引入的元素重名,应该给引入的元素起别名
use a\b\c\d\类名 as 类名X;
echo 类名X::$name; //非限定名称访问

公共空间(无namespace关键字)

  • 在有命名空间的设置的程序中访问用 元素
  • 通过非限定方式访问:先找当前空间元素(没有再找公共空间)
注意
  1. 第一个namespace前面不能有任何代码(header也要写在下面)
  2. 命名空间名称可以重复,但是同名空间里不能有同名元素

例子

<?php
    //namespace 空间名
    namespace space1;

    const USER='root';
    function a(){
        echo 'a';
    }

    namespace space2;

    const USER='admin';
    function a(){
        echo 'b';
    }
    
    //默认当前空间(挨着最近的空间)
    a();
    echo USER;


    //访问其他空间的元素
    \space1\a();
    echo \space1\USER;
    

    echo '<hr>';
    

    //多级空间
    namespace xian\yanta\yuhua;

    class stu{
        public $name='xiaobai';
        static $age='12';
    }

    namespace xianyang\liquan\junma;

    class stu{
        public $name='xiaohei';
    }

    //访问当前空间
    $stu=new stu();
    echo $stu->name;

    //访问其他空间
    $stu=new \xian\yanta\yuhua\stu();
    echo $stu->name;

    echo '<hr>';

    namespace d1;
    
    function e(){
        echo 'e';
    }
    
    namespace d2\a;
    function e(){
        echo 'e2';
    }

    namespace d2;
    
    function e(){
        echo 'e1';
    }
    //1.非限定名称
    e();

    //2.完全限定名称
    \d1\e();

    //3.限定名称(自动拼接空间名)
    a\e();

    echo '<hr>';
    //空间引入
    use xian\yanta\yuhua;  //引入空间
    $stu=new yuhua\stu();  //限定名称方式访问
    echo $stu->name;

    echo '<hr>';
    //元素引入(仅类)
    use xian\yanta\yuhua\stu;
    echo stu::$age; //非限定名称访问
?>

zpfei
186 声望7 粉丝

往事如风~