zoukankan      html  css  js  c++  java
  • PHP命名空间

    1、概述

    命名空间是PHP为了解决重名问题推出的机制,密码空间可以认为地将内存进行分隔,让不同内存区域的同名结构得以共存,类似操作系统中文件夹的概念

    基础语法:namespace space_name;

    一个文件中可以声明多个命名空间,但实际开发往往只会定义一个,第一次声明的命名空间必须在所有代码之前

    2、命名空间子空间

    类似子文件夹的概念,可以在一个命名空间下面创建一个子空间:namespace spaceson_space1;

    同时子空间下还可以创建下一级子空间:namespace spaceson_space1son_space2;

    3、全局空间

    所有定义的命名空间的顶级空间,所有未定义命名空间的脚本都位于全局空间中

    所有空间本质上都是在全局空间中划分出来的

    所有系统常量、系统函数、系统类都属于全局空间下的

    在命名空间中,使用非限定名称方式访问空间成员时,首先会在当前空间内查找,如果找不到,会去全局空间查找该成员是否是系统常量或系统函数,不会查找系统类。

    4、空间元素访问

    4.1、非限定名称访问:直接访问当前空间内成员

    4.2、限定名称访问:用于访问当前空间子空间的成员,在元素前使用空间名字+来访问

    4.3、完全限定名称访问:从全局空间(相当于根目录,用表示)开始写路径,相当于绝对路径

    后两种访问方式只能访问空间中的常量,函数和类

    <?php
    
    //第一个声明的命名空间之前不能有其他代码 
    namespace p2;
    function a(){
        echo $a.'p2<br>';
    }
    
    namespace p1s1;
    class A{
        function __construct(){
            echo 's1<br>';
        }
    }
    
    
    namespace p2s2;
    const A = 's2';
    
    namespace p1;
    function a(){
        echo 'p1<br>';
    }
    
    //非限定名称访问
    a();            //p1
    //限定名称访问
    new s1A();        //s1
    //完全限定名称访问
    echo p2s2A;    //s2
    
    //非限定名称访问系统常量
    echo __FILE__.'<br>';
    //非限定名称访问系统函数
    echo time().'<br>';
    //非限定名称访问系统类
    //new mysqli();      //报错
    new mysqli();        //必须使用完全限定名称访问

    5、命名空间引入

    为了减少复杂的完全限定名称访问,可以将其他空间的成员(类、函数、常量)引入到当前空间,从而直接使用非限定名称访问

    引入方式,使用use关键字:

    namespace s1;
    class Man{}
    function f(){}
    const PI = 3.14;
    
    namespace s2;
    
    //引入类
    //use s1Man;
    new Man();
    //引入函数
    //use function s1f;
    f();
    //引入常量
    //use const s1PI;
    echo PI;
    
    //一次性引入
    // use s1{
    //     Man,
    //     function f,
    //     const PI
    // };

    注意:使用use进行空间引入时,默认从全局空间开始构建路径,即不以符号开头的路径会在路径开头自动加上符号,以上代码 use s1Man;等价于use s1Man;

    重名问题:

    如果存在重名,则在use语句后面加上as 别名:use s1Man as alias;

    namespace s1;
    class Man{}
    const PI = 3.14;
    namespace s2;
    class Man{}
    const PI = 3.14159;
    use s1{
        Man as M,
        const PI as PI1
    };
    new M();

    引入空间: use spacename; 引入的空间可看作当前空间的子空间

    namespace s1;
    class Man{}
    function f(){}
    const PI = 3.14;
    namespace s2;
    use s1;
    new s1Man();
    s1f();
    echo s1PI;
  • 相关阅读:
    邮件系列3 --- 安全传输
    配置postfix支持虚拟域和虚拟用户
    Postfix+Sasl+Courier-authlib+Dovecot+MySQL+extmail 邮件系统部署
    在switch中的case语句中声明变量编译出错的解决方案
    关于自控力
    PUTTY使用Ctrl+s僵死的问题
    sqlite3里类似top的用法
    二维数组、行指针、指针数组、二级指针
    sqlite3_exec函数的使用
    基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10385646.html
Copyright © 2011-2022 走看看