关键词搜索

源码搜索 ×
×

PHP命名空间入门

发布2021-01-26浏览395次

详情内容

第1章 命名空间针对的主要对象

1-1 函数的命名空间

<?php
/**
 * 命名空间解决了函数的全局命名冲突问题
 * 如果代码使用了命名空间,那么所有代码必须写到命名空间中
 *
 * 同一空间不允许有两个同名的函数
 */

namespace a
{
    function hello()
    {
        /**
         * 常量__NAMESPACE__:当前空间名称
         * 常量__FUNCTION__:当前函数名称
         */
        return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
    }
}

namespace b
{
    function hello()
    {
        //return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
        return \a\hello(); // 不同空间之间的函数调用,需要写完整的命名空间名称
    }
}

// 全局命名空间名称默认为\,可以省略
namespace
{

    /**
     * 全局空间中调用独立的空间中的函数
     * 不同空间之间的相互调用,需要使用完整空间名称
     */
    //echo \a\hello();
    // 调用a空间中的函数hello
    echo a\hello();
    echo '<hr>';
    // 调用b空间中的函数hello
    echo b\hello();
}

    执行效果:
    在这里插入图片描述

    1-2 类的命名空间

    <?php
    // 命名空间解决了类的全局命名冲突问题
    
    /**
     * 同意脚本不允许重复声明两个同名的类
     */
    namespace a
    {
        class A
        {
            public $name = "Tom";
            public function say()
            {
                $namespace = '命名空间:'.__NAMESPACE__;
                $className = '类名:'.__CLASS__;
                $methodName = '方法名:'.__METHOD__;
                return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
            }
        }
    }
    
    namespace b
    {
        class A
        {
            public $name = "Jackson";
            public function say()
            {
                $namespace = '命名空间:'.__NAMESPACE__;
                $className = '类名:'.__CLASS__;
                $methodName = '方法名:'.__METHOD__;
                // 不同空间之间的数据访问必须使用完整空间名称
                $temp = (new \a\A())->name; // 不同空间之间的类的访问
                //return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
                return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$temp;
            }
        }
    }
    
    namespace // 全局空间,默认用反斜线\表示
    {
        echo (new a\A())->say();
        echo '<hr>';
        echo (new b\A())->say();
    }
    
      45

    执行效果:
    在这里插入图片描述

    1-3 常量的命名空间

    <?php
    namespace a
    {
        /**
         * const关键字声明的常量,访问时受命名空间限制
         * define函数声明的常量,不受命名空间限制
         */
        // 使用const声明
        //const SITE_NAME = 'www.csdn.net';
        // 使用define函数
        define('SITE_NAME', 'www.csdn.net');
    }
    
    namespace b
    {
        const SITE_NAME = 'www.php.cn';
    }
    
    namespace
    {
        //echo a\SITE_NAME;
        /**
         * 使用define函数创建的常量,没有命名空间的概念,默认就是全局的
         */
        echo SITE_NAME;
        echo '<hr>';
        echo b\SITE_NAME;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    执行效果:
    在这里插入图片描述

    第2章 命名空间的分级管理

    2-1 命名空间中的普通变量

    <?php
    /**
     * 变量本身是一个容器,命名空间对它来说没什么意义
     */
    
    /**
     * 普通变量的访问不受命名空间限制
     * 常量、类、函数必须使用命名空间访问(即受命名空间限制)
     */
    namespace a
    {
        $title = '<span style="color:red;">PHP中文网</span>';
        echo '当前空间的变量:'.$title.'<hr>'; // 本空间访问
        const CITY = '北京';
    }
    namespace b
    {
        //echo '访问另一个空间中的变量'.\a\$title; // syntax error, unexpected '$title' (T_VARIABLE), expecting identifier (T_STRING)
        // 变量名称前不允许带空间名称
        echo '访问另一个空间中的变量'.$title.'<hr>';
    }
    
    namespace
    {
        echo '全局空间中访问另一空间中的变量'.$title;
        echo '<hr>';
        // 常量、类、函数必须使用命名空间访问
        echo a\CITY;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    执行效果:
    在这里插入图片描述

    2-2 命名空间的分层机制

    <?php
    
    /**
     * 将命名空间进行分级管理,可以使不同空间的代码之间的逻辑关系更加的清晰
     * 将有一定层级关系的命名空间的标识符之间用反斜线进行分隔 \
     *
     * 类空间的分级机制,是类文件自动加载的实现基础
     */
    
    namespace father
    {
        const SITE_NAME = '百度';
    }
    
    namespace father\sub
    {
        const DOMAIN = 'www.baidu.com';
    }
    
    namespace
    {
        echo \father\SITE_NAME.'的域名是:'.\father\sub\DOMAIN;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    百度的域名是:www.baidu.com
    
    • 1

    第3章 命名空间的引入与简化

    3-1 命名空间的导入与简化

    <?php
    
    /**
     * 命名空间的导入,本质上就是用一个别名,来简化一个比较长的多级的命名空间名称
     *
     * 导入主要针对类空间,PHP5.6以后,也支持常量与函数空间名称导入
     *
     * 导入空间默认名称主要用use,空间别名的简化用as
     * 使用use导入空间别名,可用as来自定义别名,防止空间重名
     */
    
    namespace app\index\controller;
    const CITY = '北京';
    
    function say()
    {
        return 'Hello world!';
    }
    
    class User
    {
        public function hello()
        {
            return "I'm fine, thank you!";
        }
    }
    
    namespace myspace;
    
    // 不使用use来简化空间名称
    
    echo \app\index\controller\CITY.'<br>';
    echo \app\index\controller\say().'<br>';
    $user = new \app\index\controller\User;
    echo $user->hello();
    echo '<hr>';
    
    // 用use来导入一个命名空间,并起个简短的名称
    use const app\index\controller\CITY;
    use function app\index\controller\say;
    use app\index\controller\User;
    echo CITY.'<br>';
    echo say().'<br>';
    $user = new User;
    echo $user->hello();
    echo '<hr>';
    
    // 用as来进一步简化空间的名称
    use const app\index\controller\CITY as C;
    use function app\index\controller\say as s;
    use app\index\controller\User as U;
    echo C.'<br>';
    echo s().'<br>';
    $user = new U;
    echo $user->hello();
    echo '<hr>';
    
      45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    执行效果:
    在这里插入图片描述

    3-2 全局/公共命名空间

    <?php
    namespace demo;
    $name = 'lisi';
    /**
     * stdClass是系统定义在全局中的一个标准类
     * 访问全局中的标准类或函数,需要在前面加反斜线\
     */
    $obj = new \stdClass();
    
    // 不同的空间下,自定义函数与系统函数可以重名
    function strtoupper($str)
    {
        // 访问全局系统函数必须加全局空间标识\
       return \strtoupper($str);
    }
    
    echo strtoupper($name); // 这里调用的是当前demo空间下的strtoupper函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    LISI
    
    • 1

    3-3 命名空间的三种引入方式

    <?php
    /**
     * 命名空间的三种引用方式:
     * 1.非限定名称
     * 2.限定名称
     * 3.完全限定名称
     */
    
    namespace app\admin;
    const SITE_NAME = 'PHP中文网';
    function getDomain()
    {
        return 'www.php.cn';
    }
    
    class Demo
    {
        public static function hello()
        {
            return 'Hello world';
        }
    }
    
    
    // 1.非限定名称:省略空间名称,使用默认或当前的命名空间
    echo SITE_NAME.'<br>';
    echo getDomain().'<br>';
    echo Demo::hello().'<hr>';
    
    // 2.限定名称:前面必须添加命名空间才可以访问,通常用于子空间
    namespace app\admin\user;
    const SITE_NAME = '百度';
    function getDomain()
    {
        return 'www.baidu.com';
    }
    
    class Demo
    {
        public static function hello()
        {
            return 'Never say never';
        }
    }
    
    namespace app\admin;
    echo user\SITE_NAME.'<br>';
    echo user\getDomain().'<br>';
    echo user\Demo::hello().'<hr>';
    
    
    // 3.完全限定名称:从全局空间的反斜线开始\
    echo \app\admin\SITE_NAME.'<br>';
    echo \app\admin\getDomain().'<br>';
    echo \app\admin\Demo::hello().'<hr>';
    
    echo \app\admin\user\SITE_NAME.'<br>';
    echo \app\admin\user\getDomain().'<br>';
    echo \app\admin\user\Demo::hello().'<hr>';
    
      45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    执行效果:
    在这里插入图片描述

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载